【问题标题】:Get the file size in android sdk?获取android sdk中的文件大小?
【发布时间】:2011-10-31 05:00:51
【问题描述】:

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

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

而且长度总是为零,是的为零。

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

也许是权限问题?我有什么遗漏吗?

【问题讨论】:

    标签: java android file


    【解决方案1】:

    File.length() 方法返回以下according to the javadoc

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

    如您所见,可以返回零:

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

    我的钱在第二个案子上;即您的文件名/路径名错误。尝试在文件名上调用File.exists() 看看它告诉你什么。我猜其他两种情况也是可能的。

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

    【讨论】:

      【解决方案2】:

      如果您想以 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;
      }   
      

      【讨论】:

        【解决方案3】:

        你应该使用:

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

        代替:

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

        【讨论】:

        • 我在问题中看不到“uri.toString()”。 'new File("/sdcard/lala.txt")' 如果你知道路径是正确的就可以了。
        • 为什么会有任何不同? "/sdcard/lala.txt" 是路径名...不是 URL。
        • @Stephen C URI != URL
        • 是的,我知道。这就是我说 URL 的原因。请尝试理解我在评论中的实际意思。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          Kotlin 扩展解决方案

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

          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"
          

          【讨论】:

            猜你喜欢
            • 2011-08-28
            • 1970-01-01
            • 1970-01-01
            • 2021-11-13
            • 2018-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多