2010-02-10 26 views

回答

3

首先,我想有兩件事情,可以幫助你:

  • 考慮打開文件
  • 時,如果從文件中的數據只需要withing功能範圍使用的FileAccess和文件共享標誌使用建設

    using(FileStream stream = File.Open(...)) { <file operations> }

    這將確保該文件將被退出「使用」塊後立即關閉,而不是當FileStrea m對象由GC收集。

其次,有一種不安全的方式來獲取使用該文件的進程。它基於windows提供的調試功能。主要思想是獲取所有系統句柄並遍歷它們以找到哪些文件句柄和附加信息。這是使用我不確定記錄的函數完成的。如果您有興趣使用谷歌查找更多信息,但我不認爲這不是一個好方法。

+0

似乎足夠感謝諷刺 – Ravisha 2010-02-10 08:32:55

2
    public bool IsInUse(string path) 
       { 
        bool IsFree = true; 
        try 
        { 
         //Just opening the file as open/create 
         using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate)) 
         { 
         //we can check by using 
         fs.CanRead // or 
         fs.CanWrite 
         } 

        } 
        catch (IOException ex) 
        { 
         IsFree = false; 
        } 
        return IsFree; 
       } 


        string path = "D:\\test.doc"; 
        bool IsFileFree = IsInUse(path); 
+0

有沒有其他的選擇,我的意思是檢查文件狀態,而不是進入Try catch? – Ravisha 2010-02-10 08:30:36

6

否。唯一的方法是嘗試訪問文件並處理IOException。

實際上,這是唯一安全的方式。假設有一個IsFileInUse()方法,並且您調用了它,它返回「nope,沒有人使用該文件」,然後您繼續訪問該文件。問題是與此同時,其他進程可能會鎖定或刪除文件。所以你需要將異常處理放在你試圖訪問文件的地方。 「通過獲取測試」模式是唯一一個100%可靠的模型。

如果一個文件正在被另一個進程使用,.NET不提供確定哪個其他進程可能的方法。我相信這需要一些非常低級的非託管代碼,儘管我可能是錯的。如果可能的話,這是一個非常低級的操作,「從該流程中釋放文件」,因爲這違反了其他流程的期望 - 例如,它認爲它被允許寫入文件,但是你已經刪除了該文件並且處理了該文件。我相信如果你不願意自願放棄它的話,你需要終止另一個過程。

相關問題