当前位置: 首页 > 面试题库 >

如何查看文件夹和子文件夹的更改

邹开畅
2023-03-14
问题内容

我正在尝试查看特定文件夹中的更改,然后,如果其中发生任何添加/修订/删除,则需要获取该文件夹及其子文件夹中所有文件的更改类型。我正在WatchService为此使用,但它仅监视单个路径,不处理子文件夹。

这是我的方法:

try {
        WatchService watchService = pathToWatch.getFileSystem().newWatchService();
        pathToWatch.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
                StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

        // loop forever to watch directory
        while (true) {
            WatchKey watchKey;
            watchKey = watchService.take(); // This call is blocking until events are present

            // Create the list of path files
            ArrayList<String> filesLog = new ArrayList<String>();
            if(pathToWatch.toFile().exists()) {
                File fList[] = pathToWatch.toFile().listFiles();
                for (int i = 0; i < fList.length; i++) { 
                    filesLog.add(fList[i].getName());
                }
            }

            // Poll for file system events on the WatchKey
            for (final WatchEvent<?> event : watchKey.pollEvents()) {
                printEvent(event);
            }

            // Save the log
            saveLog(filesLog);

            if(!watchKey.reset()) {
                System.out.println("Path deleted");
                watchKey.cancel();
                watchService.close();
                break;
            }
        }

    } catch (InterruptedException ex) {
        System.out.println("Directory Watcher Thread interrupted");
        return;
    } catch (IOException ex) {
        ex.printStackTrace();  // Loggin framework
        return;
    }

就像我之前说过的,我只获取所选路径中文件的日志,并且我想查看所有文件夹和子文件夹文件,例如:

范例1:

FileA (Created)
FileB
FileC
FolderA FileE
FolderA FolderB FileF

范例2:

FileA
FileB (Modified)
FileC
FolderA FileE
FolderA FolderB FileF

有没有更好的解决方案


问题答案:

A WatchService仅监视Path您注册的S。它不会递归地通过这些路径。

鉴于/Root作为注册路径

/Root
    /Folder1
    /Folder2
        /Folder3

如果中有更改Folder3,它将无法捕获。

您可以自己递归注册目录路径

private void registerRecursive(final Path root) throws IOException {
    // register all subfolders
    Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
            return FileVisitResult.CONTINUE;
        }
    });
}

现在,WatchService会通知的所有子文件夹中的所有更改Path root,即。Path您通过的论点。



 类似资料:
  • 问题内容: 我有一个名为“数据”的文件夹。此文件夹有一个名为“收件箱”的子文件夹,其中有多个“ .txt”文件。可以修改“数据”文件夹,最后会有多个带有“收件箱”子文件夹和“ .txt”文件的子文件夹。我需要监视“收件箱”文件夹中的“数据”文件夹和“ .txt”文件。我怎样才能做到这一点? INotify只是监视文件夹,并在创建子文件夹时弹出事件。创建“ .txt”文件(在哪个文件夹中)时,如何弹

  • 本文向大家介绍Linux中查看指定文件夹内各个子文件夹内的文件数量,包括了Linux中查看指定文件夹内各个子文件夹内的文件数量的使用技巧和注意事项,需要的朋友参考一下 count脚本 执行 $ bash count.sh benchmark benchmark: 2317 benchmark/0: 20 benchmark/1: 891 benchmark/2: 65 benchmark/3: 1

  • 我有一个像这样的文件夹 应用程序 供应商 引导程序 公开的 文件夹 img 当我从url访问时http://example.com/img/img.png它工作,但当我喜欢访问http://example.com/img/我得到禁止403,我需要的是重定向或显示该页面没有找到我的。htaccess看起来像这样。 选项-多视图选项-索引重写引擎打开

  • 如何从资源文件夹的子文件夹中读取文件。 我在资源文件夹中有一些json文件,例如: 现在我想在我的课堂上读到这个 这是我正在尝试的,但是失败了。 不起作用,那么我正在尝试: 这两样东西都不工作。

  • 问题内容: 我想在Linux中一步(命令)更改文件夹及其所有子文件夹和文件的权限。 我已经尝试过以下命令,但仅适用于上述文件夹: 有没有一种方法来设置的所有内容,包括子文件夹和文件? 另外,将来,如果我在其中创建新文件夹或文件,如何将其权限自动设置为? 我也看了这个链接: http://stackoverflow.com/questions/3740187/how-to-set-default-c

  • 问题内容: 我正在尝试压缩包含子文件夹的文件夹。尝试压缩名为10-18-2010_4D的文件夹。以上程序以以下异常结束。请提供有关如何解决此问题的建议。 问题答案: 您需要检查文件是否为目录,因为您无法将目录传递给zip方法。 看一下该页面,该页面显示了如何递归压缩给定目录。