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.)
"/sdcard/lala.txt"
ist ein Pfadname ... keine URL.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()
quelle
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.sizeInMb
Sie dann an oder je nachdem, was Sie benötigenval 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"
quelle