2011-12-26 38 views
4

如何檢查文件是否已經在努力將其刪除 編程之前打開之前打開?檢查文件是否已經在努力將其刪除

像這樣

if (file is open){ 
    // close it first 
} 

// delete file 
+0

你不知道你是否打開這個文件? –

+0

已回答:http://stackoverflow.com/questions/1390592/java-check-if-file-is-already-open –

回答

3

我不認爲這會爲幾個原因工作。

  1. 如果您已經打開文件,沒有用於測試的標準Java機制。

  2. 即使有這樣的機制,這將是很難找到的文件句柄,這樣你可以關閉它。

  3. 即使可以找到文件句柄,也存在潛在的競爭條件,其中一個線程測試文件並嘗試刪除它,第二個線程打開文件句柄。

  4. 沒有這個地址某些其他進程打開文件的情況。

如果你有刪除您的應用程序已經打開的文件有問題,那麼最有可能的是,真正的問題是,您的應用程序泄漏文件描述符。並且,最好的解決辦法是找到和修復泄漏......或以確保您所有的文件流等都是採用「嘗試/終於」或新的Java 7構建「以資源嘗試」關閉。

在另一方面,如果該文件被其他進程打開了,那麼你可能也只是嘗試刪除該文件未經測試,看它是否是開放的。如果刪除成功,則成功。否則,檢測故障並做什麼,如果你檢測到的文件被打開,你會做。

0

基本上,必須跟蹤您是否已打開的文件如果你需要確保它關閉。

注意,在Unix系統中,刪除一個打開的文件是不是一個問題,將正常工作。

0

你可以嘗試鎖定文件,如果文件沒有被其他人打開,你不會得到一個異常,否則你會得到一個異常,所以寫一個這樣的函數,你可以檢查一個文件是否

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 
} 
+1

問題:它不是原子的。但是足夠快,我想...... – fge

0

喜@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 
相關問題