Próbowałem skopiować & wkleić bardzo mały plik do folderu obserwowanego przez usługę oglądania. Po raz pierwszy działa świetnie, ale na wszystkich następnych kopiach & otrzymuję wyjątek, że inny proces obsługuje już plik. Eksperymenty wykazały, że moja usługa jest informowana, gdy system Windows tworzy plik, a nie kiedy jego zawartość jest kopiowana. Jeśli zablokuję plik, system Windows nie będzie mógł skopiować żadnych danych, a plik jest pusty. Z drugiej strony, jeśli przeniesię plik do katalogu, wszystko działa poprawnie.Java: WatchService zostaje poinformowany przed skopiowaniem zawartości
Czy to błąd z systemu Windows? Nie mogłem go przetestować na stacji roboczej Mac lub Linux. A może po prostu nie byłem w stanie tego zrobić. Każda pomoc jest doceniana.
Mój kod wygląda następująco:
try (WatchService watchService = importPath.getFileSystem().newWatchService()) {
importPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
handleExistingFiles();
try {
do {
WatchKey watchKey = watchService.take();
if (!watchKey.isValid()) {
continue;
}
boolean hasCreationEvents = false;
for (WatchEvent<?> event : watchKey.pollEvents()) {
hasCreationEvents |= event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE);
}
watchKey.reset();
if (hasCreationEvents) {
handleNewFiles();
}
}
while (!Thread.currentThread().isInterrupted());
}
catch (InterruptedException ignoredEx) {
Thread.currentThread().interrupt();
}
}
Co program (y) tworzy plik, który oglądasz? Nie zapominaj, że często programy piszą do pliku tymczasowego i tylko wtedy nadpisują oryginalny – fge
jego starszy program, który tworzy plik wyjściowy do przesyłania danych do bieżącego. Sprawdzę, jak plik zostanie zapisany, ale jak wspomniał Oleg, może to być problem, że występują dwa zdarzenia, jeden dla stworzenia i jeden dla modyfikacji, a ja odpowiedziałem na zły ... – Teazl