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

Lesezeit: 3 Minuten

Benutzer-Avatar
Chinanzio

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 wird in einer Aktivität ausgeführt, ich habe eine SD-Karte erstellt.

Vielleicht ist es ein Berechtigungsproblem? Gibt es etwas, das ich vermisse?

Benutzer-Avatar
Stefan C

Das File.length() -Methode gibt Folgendes zurück laut javadoc:

“Die Länge der durch diesen abstrakten Pfadnamen bezeichneten Datei in Bytes oder 0L, wenn die Datei nicht existiert. Einige Betriebssysteme geben möglicherweise 0L für Pfadnamen zurück, die systemabhängige Entitäten wie Geräte oder Pipes bezeichnen.”

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

  • wenn die Datei existiert, aber null Bytes enthielt.
  • wenn die Datei nicht existiert, oder
  • wenn es sich bei der Datei um eine betriebssystemspezifische Spezialdatei handelt.

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

(Fürs Protokoll, die meisten /proc/... Dateien auf einem Linux-basierten System haben ebenfalls eine scheinbare Dateigröße von null. Und Android basiert auf Linux.)

Benutzer-Avatar
Pir Fahim Schah

Wenn Sie die Ordner-/Dateigröße in Bezug auf erhalten möchten Kb oder Mb Verwenden Sie dann den folgenden Code. Es wird Ihnen helfen, die genaue Größe Ihrer Datei zu finden.

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;
}   

Benutzer-Avatar
Kamal Verma

Du solltest benutzen:

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

Anstatt von:

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

  • Ich kann “uri.toString()” in der Frage nicht sehen. ‘new File(“/sdcard/lala.txt”)’ ist in Ordnung, wenn Sie wissen, dass der Pfad richtig ist.

    – Der unglaubliche Jan

    14. November 2017 um 7:16 Uhr

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

    – Stefan C

    4. Juli 2018 um 6:44 Uhr

  • @Stephen C URI != URL

    – Der unglaubliche Jan

    8. Oktober 2018 um 11:42 Uhr

  • Ja, ich weiß, dass. Deshalb habe ich URL gesagt. Bitte versuchen Sie zu verstehen, was ich eigentlich in dem Kommentar sage.

    – Stefan C

    8. Oktober 2018 um 12:37 Uhr


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

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

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, versuchen Sie, diese hinzuzufügen, um die Arbeit mit ihnen aussagekräftiger zu gestalten:

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

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

Um die tatsächliche Dateigröße zu lesen, Fügen Sie diese irgendwo hinzu und rufen Sie dann an myFile.sizeInMb oder was auch immer Sie brauchen

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. Fühlen Sie sich frei, die angezeigten Standarddezimalzahlen anzupassen

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"

1216080cookie-checkHolen Sie sich die Dateigröße im Android SDK?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy