我正在运行此代码来遍历目录 -
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
public class FindDirectoriesTest {
public void find()
throws IOException
{
Path dir = Paths.get("some_dir");
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
if (attrs.isDirectory()) {
//do something;
} else {
//do something else
}
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
{
return FileVisitResult.CONTINUE;
}
});
}
}
问题是attrs.isDirectory()
即使有目录也不会执行。它正确列出所有常规文件,但不列出目录。这里有什么遗漏吗?
答案 0 :(得分:3)
bskaggs是对的。我在研究nio包时遇到了同样的问题。 然后找到了这个页面。想知道为什么这个问题没有得到回答或关闭,因为多年前就被问过了。 以下是打印您提供的路径的子目录列表的代码。
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class WalkTreeExample {
public static void main(String[] args) throws IOException {
Path p = Paths.get("C:\\Users");
Files.walkFileTree(p, new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if(Files.isDirectory(dir))
System.out.println(dir);
return FileVisitResult.CONTINUE;
}
});
}
}
答案 1 :(得分:1)
visitFile
仅在访问文件时调用,而不是在目录中调用。您应该添加另一个覆盖preVisitDirectory
或postVisitDirectory
的函数(取决于您是否希望在访问子目录中的所有文件之前或之后执行操作),并放置特定于目录的函数那里的逻辑。