Holen Sie sich die Dateigröße in Android SDK?


77

Ich habe ein Problem beim Abrufen der Größe einer Datei. Ich habe folgenden Code:

File file = new File("/sdcard/lala.txt");
long length = file.length();

Und immer ist die Länge Null, ja Null.

Ich verwende Android SDK (nicht sicher, welche Version), der Code läuft in einer Aktivität, ich habe eine SD-Karte erstellt.

Vielleicht ist es ein Erlaubnisproblem? Fehlt mir etwas?

Antworten:


90

Die File.length()Methode gibt laut Javadoc Folgendes zurück :

"Die Länge der mit diesem abstrakten Pfadnamen bezeichneten Datei in Byte oder 0L, wenn die Datei nicht vorhanden ist. Einige Betriebssysteme geben möglicherweise 0L für Pfadnamen zurück, die systemabhängige Entitäten wie Geräte oder Pipes angeben."

Wie Sie sehen können, kann Null zurückgegeben werden:

  • Wenn die Datei vorhanden ist, aber keine Bytes enthält.
  • wenn die Datei nicht existiert, oder
  • Wenn es sich bei der Datei um eine betriebssystemspezifische Spezialdatei handelt.

Mein Geld ist im zweiten Fall; dh dass Sie den falschen Dateinamen / Pfadnamen haben. Rufen Sie File.exists()den Dateinamen auf, um zu sehen, was Ihnen das sagt. Die beiden anderen Fälle sind auch möglich, denke ich.

(Für die Aufzeichnung haben die meisten /proc/...Dateien auf einem Linux-basierten System auch eine scheinbare Dateigröße von Null. Und Android ist Linux-basiert.)


29

Wenn Sie die Ordner- / Dateigröße in KB oder MB erhalten möchten, verwenden Sie den folgenden Code. Dies hilft Ihnen dabei, die genaue Größe Ihrer Datei zu ermitteln.

public static String getFolderSizeLabel(File file) {
    long size = getFolderSize(file) / 1024; // Get size and convert bytes into Kb.
    if (size >= 1024) {
        return (size / 1024) + " Mb";
    } else {
        return size + " Kb";
    }
}

Diese Funktion gibt die Größe in Form von Bytes zurück:

public static long getFolderSize(File file) {
    long size = 0;
    if (file.isDirectory()) {
        for (File child : file.listFiles()) {    
            size += getFolderSize(child);
        }
    } else {
        size = file.length();
    }
    return size;
}   

6

Du solltest benutzen:

File file = new File(Uri.parse("/sdcard/lala.txt").getPath());

anstatt:

File file = new File("/sdcard/lala.txt");

1
Ich kann "uri.toString ()" in der Frage nicht sehen. 'Neue Datei ("/ sdcard / lala.txt")' ist in Ordnung, wenn Sie wissen, dass der Pfad richtig ist.
Der unglaubliche

Warum sollte das einen Unterschied machen? "/sdcard/lala.txt"ist ein Pfadname ... keine URL.
Stephen C

@ Stephen C URI! = URL
Der unglaubliche

Ja, ich weiß, dass. Deshalb habe ich URL gesagt. Bitte versuchen Sie zu verstehen, was ich im Kommentar tatsächlich sage.
Stephen C

2

Ich würde Ihnen empfehlen, den folgenden Code zu verwenden, anstatt den Pfad ("/sdcard/lala.txt") fest zu codieren:

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/lala.txt");
file.length()

-1

Kotlin-Erweiterungslösung

Das erste, was Sie mit der Datei tun sollten, ist zu bestätigen, dass sie existiert:

val File?.exists get() = this?.exists() ?: false

Wenn Sie eine Datei aus einem String oder Uri benötigen, fügen Sie diese hinzu, um die Arbeit mit ihnen deklarativer zu gestalten:

fun Uri.asFile(): File = File(toString())

fun String?.asUri(): Uri? {
    try {
        return Uri.parse(this)
    } catch (e: Exception) {
    }
    return null
}

Fügen Sie diese zum Lesen der tatsächlichen Dateigröße irgendwo hinzu und rufen myFile.sizeInMbSie dann an oder je nachdem, was Sie benötigen

val File.size get() = if (!exists()) 0.0 else length().toDouble()
val File.sizeInKb get() = size / 1024
val File.sizeInMb get() = sizeInKb / 1024
val File.sizeInGb get() = sizeInMb / 1024
val File.sizeInTb get() = sizeInGb / 1024

Wenn Sie die Werte einfach als Zeichenfolge anzeigen möchten, sind dies einfache Wrapper. Sie können die angezeigten Standard-Dezimalstellen jederzeit anpassen

fun File.sizeStr(): String = size.toString()
fun File.sizeStrInKb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInKb)
fun File.sizeStrInMb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInMb)
fun File.sizeStrInGb(decimals: Int = 0): String = "%.${decimals}f".format(sizeInGb)

fun File.sizeStrWithBytes(): String = sizeStr() + "b"
fun File.sizeStrWithKb(decimals: Int = 0): String = sizeStrInKb(decimals) + "Kb"
fun File.sizeStrWithMb(decimals: Int = 0): String = sizeStrInMb(decimals) + "Mb"
fun File.sizeStrWithGb(decimals: Int = 0): String = sizeStrInGb(decimals) + "Gb"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.