我正在编写一个热文件夹类型的程序,将文件和文件夹拖到我指定的上传文件夹中,并将其上传到云服务。
我要如何做的快速概述:
- WatchService通知我有东西被拖到文件夹中。
- 文件。在云服务中创建文件夹,以模拟所拖动的文件夹结构
- 上传我遇到的文件到各自的文件夹
我的问题是我很难找到最可靠的方法来确保我的嵌套目录树已经完全复制到我的手表文件夹。walkFileTree方法在调用时立即"快照"目录树,因此它不能检测在调用后创建的文件夹。这导致了一个问题,因为我用来检测更改的函数在调用它之后不会看到发生的更改。
为了解决这个问题,我在行走之前添加了一个Thread.sleep(3000),但这太随意了,偶尔会失败。有什么办法驯服这头野兽吗?
是否有一个实时的文件树漫步器,在调用时不设置树结构?我注定要写一个自定义函数吗?(开玩笑,听起来很有趣).
找到解决方案了。创建一个简单的检查器,以确保文件树已完全更新。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()));
}
希望在这种情况下对其他人有所帮助。