2

専用フォルダーのファイル変更を追跡するための以下のコードがあります

 Path path = Paths.get("f:\\logs");
    WatchService watchService = FileSystems.getDefault().newWatchService();
    WatchKey key = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);

    while (true) {
        final WatchKey watchKey = watchService.take();
        for (WatchEvent<?> watchEvent : key.pollEvents()) {
            WatchEvent.Kind<?> kind = watchEvent.kind();
            if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
                WatchEvent<Path> eventPath = (WatchEvent<Path>) watchEvent;
                Path newFilePath = eventPath.context();
                boolean writable = false;
                System.out.println(writable);
                long size = Files.size(newFilePath) / (1000 * 1000);

                System.out.println(newFilePath.toAbsolutePath() + "wriable:" + writable + "size:" + size);
                watchKey.reset();

            }
        }
    }

しかし、ファイル (named=newfile.dat) が作成され、プログラムが次の行にヒットした場合:

長いサイズ = Files.size(newFilePath) / (1000 * 1000);

それは投げます

java.nio.file.NoSuchFileException: newfile.dat

および変数

writable

always= false (Whileループに入れてスリープして再チェックしても)

何が起こったのか教えてください??

4

1 に答える 1

0

変数newFilePathが常に相対パスであることがわかりました:(:(

私は使用によって回避します

Path dir = (Path) watchKey.watchable();
Path fullPath = dir.resolve(newFilePath);

fullPath正しくファイルのパスです

しかし、私は疑問に思います、それはあまりにもくだらないコードです:( :(

于 2012-06-11T04:08:01.090 に答える