在android sdk中获取文件大小?

chi*_*zio 71 java android file

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

File file = new File("/sdcard/lala.txt");
long length = file.length();
Run Code Online (Sandbox Code Playgroud)

并且长度始终为零,是零.

我使用的是Android SDK(不知道是哪个版本),代码在Activity里面运行,我创建了一个sdcard.

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

Ste*_*n C 90

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

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

如您所见,可以返回零:

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

我的钱是第二个案子; 即你有错误的文件名/路径名.尝试调用File.exists()文件名以查看它告诉您的内容.我想其他两个案例也是可能的.

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


Pir*_*hah 28

如果要以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";
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数将以字节的形式返回大小:

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;
}   
Run Code Online (Sandbox Code Playgroud)


小智 7

你应该使用:

File file = new File(Uri.parse("/sdcard/lala.txt").getPath());
Run Code Online (Sandbox Code Playgroud)

代替:

File file = new File("/sdcard/lala.txt");
Run Code Online (Sandbox Code Playgroud)