![](/img/trans.png)
[英]Java WatchService on Windows informing of folder creation before contents have been copied
[英]Java: WatchService gets informed before content is copied
我試圖將很小的文件復制並粘貼到監視服務觀察到的文件夾中。 第一次效果很好,但是在執行以下所有復制和粘貼操作時,我遇到了一個例外,即另一個進程已經處理了該文件。 通過實驗,我發現Windows創建文件時通知我的服務,而不是復制內容時通知我。 如果我鎖定文件,則Windows無法復制任何數據,並且文件為空。 另一方面,如果將文件移到目錄中,則一切正常。
這是Windows的錯誤嗎? 我無法在Mac或Linux工作站上對其進行測試。 也許只是我無能為力。 任何幫助表示贊賞。
我的代碼如下所示:
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();
}
}
復制操作並不總是原子的。
使用原子復制(或移動),您將獲得一個ENTRY_CREATE事件,該事件引用的文件將是完整的並可讀取。
如果副本不是原子副本,則在創建文件時將收到ENTRY_CREATE事件,然后在通過復制操作寫入文件時將收到一個或多個ENTRY_MODIFY事件。
沒有簡單的方法來確定復制操作何時完成寫入文件並釋放它。 根據操作系統和文件系統的不同,在通過復制操作鎖定文件時嘗試打開文件進行讀取時,可能會收到FileNotFoundException異常,或者可以成功打開文件,但實際讀取文件時會得到部分內容。
您將必須實施一些試探法,例如嘗試在ENTRY_CREATE之后立即讀取文件,並在初始讀取失敗時將讀取重新安排在以后的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.