【问题标题】:java.nio.file.Paths - How to skip unaccessible file/folder while iteratingjava.nio.file.Paths - 如何在迭代时跳过无法访问的文件/文件夹
【发布时间】:2018-04-23 13:41:41
【问题描述】:

我正在编写代码来遍历我可以访问的所有文件夹。 但是,当文件夹无法访问时,我的程序会停止。

我如何绕过该文件夹并继续寻找其他人? 或者,换句话说,我如何显示我可以访问的文件夹和文件?

我正在使用 java.nio.file.Paths (Java 8)。

这是我的代码:

import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Paths;

// Test File D:\TEST\test.jpg
public class TestIteration{

    // Main
    public static void main(String[] args) throws Exception {
        // Iterate through folders
        String rootFolder = "c:\\";    
        WalkDirTree(rootFolder); // Walks through directory tree and print names of directories/files.      
    }


    // Prints all file/directory names in the entire directory tree
    private static void WalkDirTree(String rootFolder) throws Exception {                   
        Files.walk(Paths.get(rootFolder)).forEach(path -> {
            System.out.println(path);
        });

        System.out.println("_______________________________________DONE");
    }

}

【问题讨论】:

  • 如果“停止”是指“抛出异常”,只需捕获异常并处理它。
  • 在Java中方法名应该以小写开头
  • “无法访问”是什么意思?您是在谈论一个特定的例外吗?
  • 我知道 lambdas 很有趣,但在这种情况下,您最好使用Files.walkFileTree,它可以让您单独处理每个文件的状态。

标签: java directory iteration


【解决方案1】:

如果 inaccessible 你指的是“不可读”,那么我认为你可以使用Files#isReadable;来自其文档:

测试文件是否可读。此方法检查文件是否存在以及此 Java 虚拟机是否具有允许它打开文件以进行读取的适当权限。根据实现,此方法可能需要读取文件权限、访问控制列表或其他文件属性,以检查对文件的有效访问。因此,该方法对于其他文件系统操作可能不是原子的。

您的代码如下所示:

Files.walk(Paths.get(rootFolder)).filter(Files::isReadable).forEach(path -> {
    System.out.println(path);
});

【讨论】:

  • 我喜欢这个想法,但它不起作用。它仍然停在 java.nio.file.AccessDeniedException: C:\$Recycle.Bin\S-1-5-18
  • 我试图对每个路径和文件的 lambda 表达式应用 try 和 catch,但找不到让它工作的方法。
  • 感谢您告诉我。我会看看我是否可以重新创建您的问题,但您可能需要在此处使用流以外的其他东西来解决它。
【解决方案2】:

虽然流当然很漂亮,但您可能需要单独处理每个不可访问的文件。

在这种情况下,您可以选择使用来自org.apache.commons.io 的FileUtils.listFiles 方法来创建一个简单的for 循环

String[] extensions = {"png","txt"}; // file extensions you might want to target
Collection fileObjects= FileUtils.listFiles(new File("dirPath"),extensions,true);
for (Object obj : fileObjects){
     File file = (File) obj;
     if (!Files.isReadable(file.toPath())) continue; // or do smth else
}

如果您希望定位所有文件而不考虑其扩展名,则传递 null 而不是 String 数组。

如果您不希望递归搜索,则传递 false 而不是 true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多