27

私はWatchService API を使用してディレクトリを監視しており、ユーザーがファイルをディレクトリにコピーし始めたときにENTRY_CREATEイベントを取得しています。ただし、作業しているファイルは大きくなる可能性があるため、コピーがいつ終了するか知りたいです。これを達成するために使用できる組み込みのJava APIはありますか、それとも、作成されたファイルのサイズを追跡し、サイズが大きくなったときに処理を開始するのが最善ですか?

編集:これが私のコード例です:

package com.example;

import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class Monitor {
    public static void main(String[] args) {
        try {
            String path = args[0];

            System.out.println(String.format( "Monitoring %s", path  ));
            WatchService watcher = FileSystems.getDefault().newWatchService();
            Path watchPath = FileSystems.getDefault().getPath(path);

            watchPath.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY);

            while (true) {
                WatchKey key = watcher.take();
                for (WatchEvent<?> event: key.pollEvents()) {
                    Object context = event.context();
                    System.out.println( String.format( "Event %s, type %s", context, event.kind() ));

                }
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

次の出力が生成されます。

Monitoring /Users/ericcobb/Develop/watch
Event .DS_Store, type ENTRY_MODIFY
Event 7795dab5-71b1-4b78-952f-7e15a2f39801-84f3e5daeca9435aa886fbebf7f8bd61_4.mp4, type ENTRY_CREATE
4

7 に答える 7

10

エントリが作成されると、ENTRY_CREATEイベントが発生します。その後の変更ごとに、ENTRY_MODIFYイベントが発生します。コピーが完了すると、 で通知されますENTRY_MODIFY

于 2013-07-29T20:35:55.453 に答える
3
  • これを実現する最も一般的な方法は、ファイルを同じパーティションの一時ディレクトリにコピーしてから、アトミックな移動コマンドで監視対象のディレクトリに移動することだと思います。
  • おそらく、ファイルのタイムスタンプをいじることによって解決策を達成することもできます

ただし、これらのソリューションは両方とも、書き込みアプリケーションで実現する必要があります。閲覧アプリからは確実に判断できないと思います。

于 2014-07-15T13:54:25.043 に答える