java.nio.file.Paths - 如何在迭代时跳过不可访问的文件/文件夹

时间:2018-04-23 13:41:42

标签: java iteration directory access

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

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

我正在使用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");
    }

}

2 个答案:

答案 0 :(得分:1)

如果无法访问你指的是"不可读",那么我认为你可以使用Files#isReadable;来自其文件:

  

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

您的代码如下:

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

答案 1 :(得分:-2)

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

在这种情况下,您可以使用for

中的FileUtils.listFiles方法选择简单的org.apache.commons.io循环
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