2012-03-06 42 views
1

我有一個C#實用程序需要執行一些操作,只要特定文件被另一個進程釋放,即該進程停止寫入文件。我使用下面的代碼,但它在Windows 7系統上表現不一致。C#,Windows 7:如何可靠地檢查進程是否仍在寫入文件?

private static bool FileWritten(string filename) 
    { 
     try 
     { 
      using (FileStream inputStream = File.Open(filename, FileMode.Open, 
         FileAccess.Read, 
         FileShare.None)) 
      { 
       return true; 
      } 
     } 
     catch (IOException e) 
     { 
      return false; 
     } 
    } 

有時即使看起來文件已被釋放,它也會返回false。我在while(true)循環中調用FileWritten(),只要它返回false,就會一直檢查調用FileWritten(),然後在一些最大時間後退出。調試這很困難,因爲它似乎在調試器下正常工作(即,只要文件實際發佈,它就會返回true),但直接啓動我的代碼時不起作用。此外,即使添加調試打印似乎也會影響其行爲。

是否有更可靠的方法來檢查文件是否已寫入併發布,這將運行Win 7,並且最好在Win XP上運行?

+0

類似於http://stackoverflow.com/questions/860656/how-does-one-figure-out-what-process-locked-a-file-using-c和http://stackoverflow.com/questions/317071 /如何找出哪個進程正在鎖定文件使用網 – hatchet 2012-03-06 16:49:56

+0

誰會調用訪問文件的初始進程? – 2012-03-06 16:56:43

回答

1

這個問題沒有完美的解決方案。

即使您的代碼在Windows 7上正常工作,仍然會出現競爭狀況。

想象一下FileWritten在某個時間點返回false。您的代碼假設文件不再被鎖定並繼續執行......但文件可能會在下一毫秒中再次被鎖定,並且下次嘗試訪問該文件時它會拋出異常...

難道你不能只是試圖訪問你的文件,並且如果你無法訪問它,那麼捕獲異常?然後,您可以等待幾個時間,然後重試。它比一個試圖返回布爾值的函數要更清潔IMO,以指示文件是否被進程使用。

0

您可以使用FileSystemWatcher來監聽文件上的事件。 A few of the options將允許您查看文件是否已更改。每當您收到文件更改的通知時,您都可以使用爆米花效果(重置計時器)來睡眠您的線程一段時間。然後執行你的代碼(但實際上它有你的工作在真正的路徑,而你有鎖)。如果文件仍然處於鎖定狀態,您將會失敗,還會有更多的等待事件發生。

除了讓其他進程在完成時將原始文件重命名/複製到新位置之外,沒有通用API會在另一個進程丟棄後立即爲您提供文件鎖定。 (我知道的)。

相關問題