Отримати розмір файлу в Android SDK?


77

У мене проблема з отриманням розміру файлу. У мене є такий код:

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

І завжди довжина дорівнює нулю, так нулю.

Я використовую Android SDK (не знаю, якої версії), код працює всередині Activity, я створив sdcard.

Можливо, це питання дозволу? Щось мені не вистачає?

Відповіді:


90

File.length()Метод повертає наступне в відповідно до Javadoc :

"Довжина у байтах файлу, позначеного цією абстрактною назвою шляху, або 0L, якщо файл не існує. Деякі операційні системи можуть повертати 0L для імен шляхів, що позначають суттєво залежні від системи об'єкти, такі як пристрої або канали."

Як бачите, нуль можна повернути:

  • якщо файл існує, але містив нуль байтів.
  • якщо файл не існує, або
  • якщо файл являє собою якийсь спеціальний файл для конкретної ОС.

Мої гроші - за другою справою; тобто у вас неправильне ім'я файлу / ім'я шляху. Спробуйте зателефонувати File.exists()до імені файлу, щоб побачити, що це вам говорить. Напевно, можливі й інші два випадки.

(Для запису, більшість /proc/...файлів у системі, що базується на Linux, також мають видимий розмір файлу нуль. А Android працює на базі Linux.)


30

Якщо ви хочете отримати розмір папки / файлу в перерахунку на Kb або Mb, використовуйте наступний код. Це допоможе знайти точний розмір вашого файлу.

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

Ця функція поверне розмір у байтах:

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

Ви повинні використовувати:

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

замість:

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

1
Я не бачу "uri.toString ()" у питанні. 'new File ("/ sdcard / lala.txt")' - це нормально, якщо ви знаєте, що шлях правильний.
Неймовірний

Чому це мало різницю? "/sdcard/lala.txt"- це назва шляху ... не URL-адреса.
Stephen C

@Stephen C URI! = URL
Неймовірний

Так, я це знаю. Ось чому я сказав URL. Спробуйте зрозуміти, що я насправді кажу в коментарі.
Stephen C

2

Я б запропонував вам використовувати наступний код замість жорсткого кодування шляху ("/sdcard/lala.txt"):

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

-1

Розширення Kotlin Solution

Перше, що вам слід зробити з файлом, - це підтвердити, що він існує:

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

Якщо вам потрібен файл із рядка або Uri, спробуйте додати їх, щоб зробити роботу з ними більш декларативною:

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

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

Щоб прочитати фактичний розмір файлу, додайте його кудись, а потім зателефонуйте myFile.sizeInMbабо що вам потрібно

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

Якщо ви хочете легко відображати значення у вигляді рядка, це прості обгортки. Не соромтеся налаштовувати відображені десяткові крапки за замовчуванням

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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.