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?
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.)
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;
}
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:
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"
12160800cookie-checkHolen Sie sich die Dateigröße im Android SDK?yes