7

Javaでの変更についてフォルダーを監視するための以下のコードがあります。

    public class FolderWatcher
    {
    // public List<Event> events = new ArrayList<Event>();

    public static Event call() throws IOException, InterruptedException
    {
        LOG.info("Watching folder");
        Path _directotyToWatch = Paths.get("data/input-files"); // this will be put in the configuration file
        WatchService watcherSvc = FileSystems.getDefault().newWatchService();
        WatchKey watchKey = _directotyToWatch.register(watcherSvc,  ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

        watchKey = watcherSvc.take();
        for (WatchEvent<?> event : watchKey.pollEvents())
        {
            WatchEvent<Path> watchEvent = castEvent(event);
            LOG.info(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context()));
            String eventName = event.kind().name();
            String fileName = _directotyToWatch.resolve(watchEvent.context()).toString();
            watchKey.reset();
            return new Event(eventName, fileName);
        }
        return null;

    }

@SuppressWarnings("unchecked")
static <T> WatchEvent<T> castEvent(WatchEvent<?> event)
{
    return (WatchEvent<T>) event;
}

}

と:

public abstract class AbstractWatcher
{
    abstract void eventDetected(Event event);

    private final ScheduledExecutorService threadpool;

    public AbstractWatcher(ScheduledExecutorService threadpool)
    {
        this.threadpool = threadpool;
    }

    public AbstractWatcher()
    {
        threadpool = Executors.newSingleThreadScheduledExecutor();
    }


    public void handle()
    {
        final FolderWatcherHandler handler = new FolderWatcherHandler();

        final Runnable r = new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    Event event = FolderWatcher.call();
                    if (event != null)
                    {
                        handler.eventDetected(event);
                    }
                }
                catch (IOException e)
                {
                        LOG.error("failed to watch the update", e);
                 }
                catch (InterruptedException e)
                {
                    LOG.info("thread interrupted", e);
                    Thread.currentThread().interrupt();
                    return;
                }

            }
        };

        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                    threadpool.shutdown();

            }
        });

        threadpool.scheduleWithFixedDelay(r, 0, 1, TimeUnit.NANOSECONDS);
    }
}

と:

public class FolderWatcherHandler extends AbstractWatcher
{
    @Override
    public void eventDetected(Event event)
    {
         // Do stuff
        }
}

ファイルの変更(私の場合はほとんど追加)が1つずつ行われ、追加ごとにわずかな遅延がある限り、このすべてが完璧に機能します。ただし、複数のファイルを同時にドラッグ アンド ドロップまたは追加すると、. このコードは、最初のファイルのイベントのみを検出し、残りのファイルは検出しません。実行時間をナノ秒単位で入力しましたが、役に立ちませんでした。このコード全体がこれを行う正しい方法であることに疑問を抱いています。誰かが私を助けることができますか?ありがとう。

4

2 に答える 2

1

metadata各フォルダ ( recursively) にファイルを格納してみませんか?そのファイルに、各ファイルのおよびをmetadata格納できます。スレッドは、各フォルダー内のこのファイルを同じフォルダー内の現在のファイルと比較する必要があります。それが、そのフォルダー内の変更を検出する方法です。file listmodified datesizemetadatacurrent files

その中のそれぞれに対して再帰的に行う必要があることを忘れないでくださいsubfolder。また、metadataファイルはスキャンごとに更新する必要があります。お役に立てれば..

于 2012-08-22T17:37:02.810 に答える