簡體   English   中英

如何在java中打開文件之前等待windows進程完成

[英]How to Wait for windows process to finish before opening file in java

我有一個實現了一個監聽器,通知我們是否在特定目錄中收到一個新文件。 這是通過輪詢和使用TimerTask實現的。 現在程序已設置好,一旦收到新文件,它就會調用另一個打開文件的java程序,並驗證它是否是正確的文件。 我的問題是,由於輪詢在指定的秒數后發生,可能會出現在該目錄中復制文件並因此被Windows鎖定的情況。

這會引發IOException,因為嘗試打開它進行驗證的其他java程序不能(“File正被另一個進程使用”)。

有沒有辦法讓我知道Windows何時完成復制,然后調用第二個程序從java進行驗證?

如果有人需要它們以幫助我,我將非常樂意發布代碼片段。

謝謝

非常感謝所有的幫助,我遇到了與WatchEvent相同的問題。 不幸的是,正如你所說,file.canRead()和file.canWrite()都返回true,即使文件仍被Windows鎖定。 所以我發現如果我嘗試用同一個名稱“重命名”它,我知道Windows是否正在使用它。 所以這就是我做的:

    while(!sourceFile.renameTo(sourceFile)) {
        // Cannot read from file, windows still working on it.
        Thread.sleep(10);
    }

這個有點棘手。 如果你可以控制或至少與復制文件的程序進行通信,那將是一塊蛋糕,但我想這不可能用於Windows。 我不得不用SFU軟件處理類似的問題,我通過循環嘗試打開文件進行寫入直到它變得可用來解決它。

為了避免循環時CPU使用率過高,可以以指數分布速率檢查文件。

編輯可能的解決方案:

File fileToCopy = File(String pathname);
int sleepTime = 1000; // Sleep 1 second
while(!fileToCopy .canWrite()){
    // Cannot write to file, windows still working on it
    Sleep(sleepTime);
    sleepTime *= 2; // Multiply sleep time by 2 (not really exponential but will do the trick)
    if(sleepTime > 30000){ 
        // Set a maximum sleep time to ensure we are not sleeping forever :)
        sleepTime = 30000;
    }
}
// Here, we have access to the file, go process it
processFile(fileToCopy);

我認為您可以創建File對象,然后使用canReadcanWrite來了解文件是否可以被其他java程序使用。

http://docs.oracle.com/javase/6/docs/api/java/io/File.html

其他選擇是嘗試在第一個程序上打開文件,如果它拋出異常,則不要調用其他java程序。 但我會推薦上面的'File選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM