如何檢查文件是否已經在努力將其刪除 編程之前打開之前打開?檢查文件是否已經在努力將其刪除
像這樣
if (file is open){
// close it first
}
// delete file
如何檢查文件是否已經在努力將其刪除 編程之前打開之前打開?檢查文件是否已經在努力將其刪除
像這樣
if (file is open){
// close it first
}
// delete file
我不認爲這會爲幾個原因工作。
如果您已經打開文件,沒有用於測試的標準Java機制。
即使有這樣的機制,這將是很難找到的文件句柄,這樣你可以關閉它。
即使可以找到文件句柄,也存在潛在的競爭條件,其中一個線程測試文件並嘗試刪除它,第二個線程打開文件句柄。
沒有這個地址某些其他進程打開文件的情況。
如果你有刪除您的應用程序已經打開的文件有問題,那麼最有可能的是,真正的問題是,您的應用程序泄漏文件描述符。並且,最好的解決辦法是找到和修復泄漏......或以確保您所有的文件流等都是採用「嘗試/終於」或新的Java 7構建「以資源嘗試」關閉。
在另一方面,如果該文件被其他進程打開了,那麼你可能也只是嘗試刪除該文件未經測試,看它是否是開放的。如果刪除成功,則成功。否則,檢測故障並做什麼,如果你檢測到的文件被打開,你會做。
你可以找到你的答案有check if a file is already open你的問題是這個問題的複製
基本上,你必須跟蹤您是否已打開的文件如果你需要確保它關閉。
注意,在Unix系統中,刪除一個打開的文件是不是一個問題,將正常工作。
你可以嘗試鎖定文件,如果文件沒有被其他人打開,你不會得到一個異常,否則你會得到一個異常,所以寫一個這樣的函數,你可以檢查一個文件是否
public boolean isFileOpened(File file)
boolean res = false;
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
// Get an exclusive lock on the whole file
FileLock lock = channel.lock();
try {
//The file is not already opened
lock = channel.tryLock();
} catch (OverlappingFileLockException e) {
// File is open by someone else
res = true;
} finally {
lock.release();
}
return res;
}
然後你可以使用的方法來檢查文件是否以這種方式已經打開:已經被其他人打開
if(isFileOpened(someFile)) {
//Do Something
}
問題:它不是原子的。但是足夠快,我想...... – fge
喜@chinchu和@Subash,
你不能檢查直接TLY,沒有任何API來做到這一點,你必須寫代碼,它
下面的代碼片段,您可以按照您的要求修改:
File file1 = new File("<file path>");
boolean isDeleteSuccess;
do
{
//delete the file
isDeleteSuccess = file1.delete();
if (isDeleteSuccess)
System.out.println(file1.getName() + " is deleted!");
else
{
//if not deleted then wait for 10 seconds for file to be closed
System.out.println("Delete operation is failed.");
Thread.sleep(10000);
}
} while (!isDeleteSuccess);//if not deleted then try again
你不知道你是否打開這個文件? –
已回答:http://stackoverflow.com/questions/1390592/java-check-if-file-is-already-open –