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

时间:2015-01-14 02:37:43

标签: java search 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;
        }

上面的代码仍然会从进程目录返回文件,我在这里做错了吗?

2 个答案:

答案 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)

算法:

  1. 在执行preVisitDirectory时,请确保路径为lastModified,其中保留一个Path,该路径是此目录中最后一次修改的路径(如果上次修改时间是在lastModified引用的文件之后,请访问visitFile检查文件,然后执行lastModified = &#34;该文件&#34 ;;
  2. 在执行postVisitDirectory时,将lastModified添加到List<Path>。 这样,您将构建跨目录的lastModified文件列表。如果您需要存储n个lastModified文件,那么执行相同操作但将lastModified更改为List<Path>.
相关问题