获取Android SDK中的文件大小?


77

我在获取文件大小时遇到​​问题。我有以下代码:

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

长度始终为零,是零。

我正在使用Android SDK(不确定是哪个版本),代码正在一个Activity中运行,我创建了一个sdcard。

也许这是一个许可问题?我有什么想念的吗?

Answers:


90

File.length()方法根据javadoc返回以下内容:

“此抽象路径名表示的文件的长度(以字节为单位),如果文件不存在,则为0L。某些操作系统可能为路径名返回0L,这表示系统相关的实体(例如设备或管道)。”

如您所见,可以返回零:

  • 如果文件存在但包含零字节。
  • 如果文件不存在,或者
  • 如果文件是特定于操作系统的特殊文件。

我的钱是第二种情况。即您有错误的文件名/路径名。尝试调用File.exists()文件名以查看提示。我猜其他两种情况也是可能的。

(据记录,/proc/...基于Linux的系统上的大多数文件的表观文件大小也为零。而Android基于Linux。)


29

如果要获取KbMb的文件夹/文件大小,请使用以下代码。这将有助于找到文件的准确大小。

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()”。如果您知道路径正确,则可以使用“新文件(“ /sdcard/lala.txt”)”。
令人难以置信的

为什么这会有什么不同? "/sdcard/lala.txt"是路径名...不是URL。
Stephen C

@Stephen C URI!= URL
令人难以置信的

对,我知道。这就是为什么我说URL。请尝试理解我在评论中的实际意思。
斯蒂芬·C

2

我建议您使用以下代码,而不是对路径(“ /sdcard/lala.txt”)进行硬编码:

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

-1

Kotlin扩展解决方案

您应该对文件做的第一件事是确认文件存在:

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

如果您需要来自String或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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.