0

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

快速概述我想如何做到这一点:

  1. WatchService 通知我某些内容已被拖入文件夹。
  2. Files.walkFileTree 遍历被拖拽的文件夹,在云服务中创建文件夹来模拟被拖拽的文件夹结构
  3. 将我遇到的文件上传到各自的文件夹。

我的问题是我无法找到最可靠的方法来确保我的嵌套目录树已完全复制到我的监视文件夹中。walkFileTree 方法在调用时立即“快照”目录树,因此它无法检测调用后创建的文件夹。这会导致问题,因为我用来检测更改的函数在调用后不会看到发生的更改。

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

有没有在调用时不设置树结构的实时文件树遍历器?我注定要编写自定义函数吗?(开玩笑,这听起来很有趣。)。

4

1 回答 1

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

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

于 2014-08-06T20:19:49.710 回答