【问题标题】:How to check if folder is empty in loop?如何在循环中检查文件夹是否为空?
【发布时间】:2012-10-25 14:54:14
【问题描述】:

我有一个问题,我知道如何检查文件夹是否为空,但是当我在循环中检查文件夹是否为空时总是出错,这是我的代码不起作用的示例。

String sdcard = Environment.getExternalStorageDirectory().toString();
        File file = new File(sdcard);
        File subFiles[] = file.listFiles();
        for(int i=0; i<subFiles.length; i++) {
            File subFile = new File(sdcard +"/"+ subFiles[i].getName());
            if(subFile.isDirectory() && subFile.listFiles().length==0) {

            }
        }

我的状况总是出错。

【问题讨论】:

  • 什么样的错误,在哪一行?
  • 不要使用sdCard + "/" + ... - 而是使用File.pathSeparator 常量。
  • subFile.listFiles 返回 null 所以你不能在它上面使用 .length,获取数组列表的条件,如果它是 null 意味着文件夹是空的
  • 怎么会有人猜你有什么错误?严重地 ?发布您的堆栈跟踪完整的所有相关日志
  • 我不明白的一件事:getExternalStorageDirectory 返回一个文件。为什么要调用 toString 然后从中创建一个新文件?同样,subFiles 是一个文件列表,为什么要调用 getName 并建立一个新的文件路径?

标签: android for-loop directory is-empty


【解决方案1】:

这是您的代码的更好版本,它也是一个递归版本,这意味着它将搜索存储中的所有空文件夹。实际上,在这里做空检查是不对的,因为documentation 告诉null 只有在file 不是目录时才会返回。

public static void traverseEmptyFolders(File root) {
        if (root.isFile()) {
            throw new IllegalArgumentException("Argument should be a directory.");
        }
        for (File file : root.listFiles()) {
            if (file.isDirectory()) {
                File[] contents = file.listFiles(); 
                if (contents == null || contents.length == 0) {
                    // do something for an empty folder
                } else {
                    traverseEmptyFolders(file);
                }
            }
        }
    }

    public static void someOtherMethod() {
        traverseEmptyFolders(Environment.getExternalStorageDirectory());
    }

让我知道这是否有效。

【讨论】:

  • 看起来不错,但我会使用 ! root.isDirectory() 而不是 root.isFile()。这可能有效,但文档并没有说文件和目录是互斥的;事实上,在 Android 所基于的 Linux 中,目录是一种文件。所以要判断root是否是一个目录,我们应该使用isDirectory()
【解决方案2】:
String sdcard = Environment.getExternalStorageDirectory().toString();
    File file = new File(sdcard);
    File subFiles[] = file.listFiles();
    for(int i=0; i<subFiles.length; i++) {
        File subFile = new File(sdcard +"/"+ subFiles[i].getName());

文件临时[] = subFiles.length;

        if(subFile.isDirectory() && (temp != null && temp.length == 0)) {

        }
    }

【讨论】:

  • 如果temp == null,则表示该文件夹不是目录而是文件。
  • 请检查编辑,如果 [i] 处的子文件是一个文件,它将返回一个文件而不是文件夹,所以不要检查它的长度,如果它是文件夹 temp 不为空,然后继续进一步检查长度。
  • 我试过了,但它仍然不起作用,条件从未满足
  • 查一下...我想你找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2010-10-19
  • 1970-01-01
  • 2018-06-27
  • 2017-02-13
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多