0

指定したアップロード フォルダーにドラッグされたファイルとフォルダーがクラウド サービスにアップロードされる、ホットフォルダー タイプのプログラムを作成しています。

これを行う方法の簡単な概要:

  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 に答える