2013-05-12 16 views
0

我想在文件上使用一些互斥體,所以任何進程在其他停止使用它們之前都不會碰到某些文件。我怎樣才能在.NET 3.5中做到這一點?這裏有一些細節:.NET 3.5中的最佳文件互斥體

我有一些服務,它檢查每個時間段,如果有任何文件/目錄在某些文件夾中,如果有,服務正在做一些事情。

我的另一個進程負責將文件(和目錄)移動到特定的文件夾中,一切正常。

但是我很擔心,因爲可能會出現這樣的情況,當我的複製過程將文件複製到某個文件夾並且在同一時間(同一個毫秒)時,我的服務將檢查是否有一些文件,與他們的東西(但不是所有的人,因爲它在複製過程中檢查)。

所以我的想法是把一些互斥體放在那裏(也許一個額外的文件可以用作互斥?),所以服務將不檢查任何東西,直到複製完成。

如何以可能的簡單方式實現類似的功能?

感謝您的任何幫助。

+0

「任何進程」子句無法工作,必須編寫一個程序來檢查互斥鎖。正如任何程序在嘗試打開文件時必須編寫來處理失敗一樣。 – 2013-05-12 14:22:02

回答

2

的規範的方式來實現,這是在文件名:

  • 方法A將文件複製到例如「somefile.ext.noprocess」(這是非原子)
  • 方法B忽略與「.noprocess」後綴的所有文件
  • 方法B完成複製後,將其重命名文件中的‘somefile.ext’
  • 下一次進程B檢查時,它會看到該文件並開始處理。

如果您有多個文件必須一起處理(或無),則需要將此方案調整爲包含事務文件名的其他事務文件:只有當此文件存在並且具有正確的名稱,必須處理B讀取它並處理其中提到的文件。

+0

處理B完成複製後,它將文件重命名爲「somefile.ext」,它是否也是非原子操作?所以可能會出現同樣的問題,但不能在複製期間重命名? – 2013-05-12 14:02:30

+0

重命名是兩個進程之間的原子操作** - 如果第二個進程已經看到新的名稱,它可以打開文件,而不用擔心與其他進程的交互。 – 2013-05-12 14:06:12

+0

但我的問題是,我必須等到所有複製完成。所以我需要確保服務只有在我的其他進程完成複製時纔會開始使用文件進行操作。 也許我可以通過在最後複製額外的文件來實現這一點,服務將檢查這個文件是否存在,以及它是否不等待其餘文件複製? – 2013-05-12 14:13:01

0

你的問題確實不是互斥,而是原子性。複製多個文件不是原子操作,因此可以觀察您想要阻止的處於半複製狀態的文件。

要解決您的問題,您可以將您的整個操作轉換爲單個原子文件系統操作,例如重命名(或移動)文件夾。這樣,沒有人可以觀察到中間狀態。你可以這樣做:

  1. 將文件複製到受監視文件夾之外的文件夾,但在同一個驅動器上。
  2. 複製操作完成後,移動監視文件夾內的文件夾。對於任何外部進程,所有文件都會立即出現,並且沒有機會只看到部分文件。
+0

我一直在同一個驅動器上,但複製文件夾不是原子的(據我所知)。我在C#中做的,所以我使用遞歸來複制整個目錄和所有子目錄,文件等。 – 2013-05-12 14:00:08

+0

複製文件夾不是原子的,移動文件夾*是*原子。 – 2013-05-12 15:27:17