确保文件夹树已完成,然后继续

时间:2014-08-05 22:18:07

标签: java tree watchservice

我正在编写一个hotfolder类型的程序,其中拖动到我指定的上传文件夹中的文件+文件夹被上传到云服务。

快速了解我希望如何执行此操作:

  1. WatchService通知我已将某些内容拖入文件夹。
  2. Files.walkFileTree通过拖动的文件夹,在云服务中创建文件夹以模拟拖动的文件夹结构
  3. 将我遇到的文件上传到各自的文件夹。
  4. 我的问题是我无法找到最强大的方法来确保我的嵌套目录树已完全复制到我的监视文件夹。 walkFileTree方法在调用时立即“快照”目录树,因此它无法检测调用后创建的文件夹。这会导致问题,因为我用来检测更改的函数不会看到调用后发生的更改。

    为了解决这个问题,我在步行之前添加了一个Thread.sleep(3000),但这是任意的,偶尔会失败。关于如何驯服这头野兽的任何想法?

    是否存在未在调用时设置树结构的实时文件树walker?我注定要写自定义功能吗? (开玩笑,听起来很有趣。)。

1 个答案:

答案 0 :(得分:0)

找到解决方案。创建一个简单的检查器以确保文件树已完全更新。 Apache Commons' FileUtils有一个sizeOfDirectory方法,可以返回嵌套目录树的大小。

// makes sure system has folder tree completely updated
private void waitFoldersComplete(Path child) throws InterruptedException {
    long folderSize;
    do {
        folderSize = FileUtils.sizeOfDirectory(child.toFile());
        System.out.println(folderSize);
        Thread.sleep(30);
    } while(folderSize < FileUtils.sizeOfDirectory(child.toFile()));
}

希望在这种情况下帮助其他人。