我使用下面的代码列出根文件夹中的所有文件。 (我的根目录包含许多文件夹和子文件夹。)
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;
}
上面的代码仍然会从进程目录返回文件,我在这里做错了吗?
答案 0 :(得分:2)
如果我正确理解您的问题,您希望每个目录中包含特定文本的最近创建的文件。您可以通过跟踪Map中每个目录的最新文件,并将每个文件传递给扫描程序来完成此操作:
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;
}
});
答案 1 :(得分:1)
算法:
List<Path>
。
这样,您将构建跨目录的lastModified文件列表。如果您需要存储n个lastModified文件,那么执行相同操作但将lastModified更改为List<Path>.