我使用下面的代码来列出根文件夹中的所有文件。 (我的根目录包含许多文件夹和子文件夹。)
Path startPath = Paths.get("D:\\users\\Desktop\\myRootDir");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException e) {
return FileVisitResult.CONTINUE;
}
});
有没有办法只列出最后修改的文件,并且有没有办法在 java NIO 中搜索文件的内容?
注意:最后修改的文件是指最近在一个文件夹中创建的文件。
更新
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) {
System.out.println(dir.getFileName());
if(dir.getFileName().equals("processes"))
return FileVisitResult.SKIP_SUBTREE;
else
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e) {
FileInfo mostRecentFile = mostRecentFilesByDir.remove(dir);
if (mostRecentFile != null) {
// System.out.println(mostRecentFile.path);
}
return FileVisitResult.CONTINUE;
}
上面的代码仍然从进程目录返回文件,我在这里做错了吗?
最佳答案
如果我正确理解你的问题,你想要每个目录中最近创建的包含特定文本的文件。您可以通过在映射中跟踪每个目录的最新文件并将每个文件传递给扫描程序来完成此操作:
String textToSearchFor = "important";
final Pattern searchPattern =
Pattern.compile(Pattern.quote(textToSearchFor));
Path startPath = Paths.get("D:\\users\\Desktop\\myRootDir");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
class FileInfo {
final FileTime time;
final Path path;
FileInfo(Path path, FileTime time) {
this.path = path;
this.time = time;
}
}
private final Map<Path, FileInfo> mostRecentFilesByDir =
new HashMap<>();
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e) {
FileInfo mostRecentFile = mostRecentFilesByDir.remove(dir);
if (mostRecentFile != null) {
System.out.println(mostRecentFile.path);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs)
throws IOException {
try (Scanner scanner = new Scanner(file)) {
if (scanner.findWithinHorizon(searchPattern, 0) == null) {
// Text not found.
return FileVisitResult.CONTINUE;
}
}
FileTime time = attrs.creationTime();
Path dir = file.getParent();
FileInfo info = mostRecentFilesByDir.get(dir);
if (info == null || time.compareTo(info.time) > 0) {
mostRecentFilesByDir.put(dir, new FileInfo(file, time));
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException e) {
return FileVisitResult.CONTINUE;
}
});
关于java - NIO 递归列出最后修改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934974/