2011-09-01 74 views
1

爲了避免這樣的例外測試文件的可訪問性

(1),因爲它是由另一個進程

我用下面的方法來測試的文件之前任何可訪問過程不能訪問該文件進一步處理。

private bool CheckIfFileBeingUsed(string FilePath) 
    { 
     FileStream Fs = null; 
     try 
     { 
      Fs = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.None); 
      Fs.Close(); 
     } 
     catch (Exception) 
     { 
      return true; //Error File is being used 
     } 
     return false; //File is not being used. 
    } 

誰能告訴我有任何的Windows API或其他解決方案文件可訪問的,而不是上述File.Open法這樣的測試?

+0

相關:http://stackoverflow.com/questions/1304/how-to-check-for-file-lock-in-c – Daniel

+1

術語困惑:要檢查文件是否已被鎖定,但通常「無障礙「將指您是否擁有使用該文件的訪問權限。 – Richard

+0

親愛的主席先生,會得到文件的屬性導致訪問/讀取文件?如果文件沒有準備好,那會導致異常? – Derek

回答

6

這似乎是你在這裏重複努力。由於試圖打開文件進行處理會拋出同樣的異常,爲什麼不繼續嘗試處理文件,並在出現異常時處理異常?

假設是不可能出於某種原因,檢測這樣還不是完全可靠的,因爲你現在有一個競爭條件。即使此測試通過,也無法保證當您在文件上運行其他代碼時文件將處於相同狀態。這就是爲什麼只是試圖做你想做的事情並且在那個時候處理任何異常情況的原因。

+0

不能再認同了! –

+0

我的處理將嘗試使用FileInfo類獲取文件的屬性,但會導致上述異常。這就是爲什麼我在尋找文件屬性之前要進行檢查的原因。 – Derek

+1

@Derek我仍然認爲這個觀點的立場;如果從檢查文件中得到異常,則處理該異常,而不是嘗試測試新異常。有沒有理由不適合你? – dlev

0

你的方法似乎對我有效。不要忘記關閉的情況下,該流的異常,但:

finally 
    { 
     if (Fs!= null) 
      Fs.Close(); 
    } 

請記住,沒有100%的保證,這將阻止「文件正在使用」例外。在您的檢查和實際打開文件之間總是有一段很短的時間(ms),其中文件可能會被另一個進程使用。

+1

這裏使用''使用'塊是慣用的。 – Richard

1

這是什麼檢查擺在首位的目的是什麼?您試圖通過提前發生並捕獲異常來避免異常,但爲什麼不用目前的設計來捕捉它呢?此外,這種方法受到競爭條件的限制,因爲文件在檢查後可能變得不可訪問,所以唯一正確的方法就是隻進行所需的處理並捕獲拋出的異常。

+0

我的處理設計會嘗試使用FileInfo類獲取文件的屬性,但會導致上述異常。這就是爲什麼我在尋找文件屬性之前要進行檢查的原因。 – Derek

+1

因此,您可以在CheckIfFileBeingUsed中捕獲異常,爲什麼在使用FileInfo時無法執行此操作?無論如何,再次,檢查是沒用的,並不會解決你的問題。唯一的辦法就是在閱讀文件屬性時處理這個異常。 –

+0

親愛的主席先生,會得到導致訪問/讀取文件的文件屬性?如果文件沒有準備好,那會導致異常? – Derek

0

至於你處理檢查文件是否存在明確的,這個方法是好的。你的方法返回true即使File Doesn't Exist

我不認爲C#提供任何API這一點。

相關問題