2013-07-19 24 views
0

我有很多寫入文件的進程(任何文件都可以寫入一次)。 他們打開,寫入和關閉文件。 另外我有很多進程是讀取文件。文件大小可以不同。 需要這樣:當某個進程嘗試讀取此刻正在寫入的文件時,寫入後關閉文件時需要讀取完整內容。我需要鎖定寫入並等待讀取時解鎖。 重要提示:如果文件讀取文件並且不能這樣做,它會自行寫入文件。 1.嘗試讀取文件 2.如果文件不存在,寫入文件如何等待寫入文件

因此,對於異步模式,可能有多個進程因爲無法讀取而想要寫入文件。我需要鎖定文件寫入,並且所有閱讀器都應等待此操作

+3

你需要它在C#或C++? –

+0

更好的C#。但我認爲可以是任何 – deeptowncitizen

回答

1

處理此問題的標準方法是寫入臨時文件名,然後在寫入完成時重命名該文件。

等待文件的其他進程需要監視真實文件的存在(使用文件系統監視器或類似的機制)。當文件「出現」時,寫入已經完成。

+0

好主意。但是當我有很多讀者/作家時,會有很多事件。文件數可以> 1k – deeptowncitizen

2

文件鎖定是特定於操作系統的事情。

類Unix系統

類Unix系統普遍支持flock()fcntl()lockf()系統調用。然而,除了lockf諮詢鎖之外,它不屬於Posix標準的一部分,因此您需要查閱特定於操作系統的文檔。爲Linux

文檔是在這裏:

注意fcntl()做了很多事情不只是鎖定。

還要注意,在大多數情況下,鎖定類Unix系統是建議性的 - 即合作努力。雙方都必須參與並簡單地忽略鎖定是可能的。強制鎖定是可能的,但在典型範例中不使用。

視窗

在windows強制性文件鎖(共享模式與CreateFile)和範圍鎖LockFileEx是正常的,並且諮詢鎖不可用,雖然它們可以被(典型地仿真用一個字節的範圍鎖在0xffffffff0xffffffffffffffff - 鎖定的部分不必實際存在,所以這並不意味着該文件很大)。

替代

爲你描述的場景的選擇,是簡單地創建具有不同名稱的文件,然後在完成時將其重命名。

E.g.如果文件被稱爲「數據20130719-112258-99823.csv」,而不是創建一個名爲「tmpdata僞-20130719-112258-99823.csv.tmp」,那麼當它已經完全寫入,將其重命名。