递归列出最后修改的文件 NIO

Recursively List last modified files NIO

我正在使用以下代码列出根文件夹中的所有文件。 (我的根目录包含很多文件夹和子文件夹。)

  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;
        }

上面的代码仍然returns进程目录中的文件,我在这里做错了吗?

算法:

  1. 当执行 preVisitDirectory 时,然后执行 Path lastModified,其中保留此目录中最后修改的路径(在 visitFile 上检查文件的最后修改时间,如果它晚于 lastModified 引用的文件之一,则执行lastModified = "that file";
  2. 在执行 postVisitDirectory 时将 lastModified 添加到 List<Path>。 这样您将构建一个跨目录的 lastModified 文件列表。如果您需要存储 n 个 lastModified 文件,则执行相同操作但将 lastModified 更改为 List<Path>.

如果我对你的问题的理解正确,你需要在每个目录中包含特定文本的最近创建的文件。您可以通过在映射中跟踪每个目录的最新文件并将每个文件传递给扫描程序来完成此操作:

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;
    }
});