簡體   English   中英

寫入文件時如何等待

[英]How to wait while file is written

我有許多寫入文件的過程(任何文件只能寫入一次)。 他們打開,寫入和關閉文件。 我也有許多讀取文件的進程。 文件大小可以多種多樣。 需要這樣:當某個進程試圖讀取此時正在寫入的文件時,當寫入后關閉文件時,我需要讀取全部內容。 我需要鎖定寫入並等待讀取時解鎖。 重要提示:如果文件讀取文件而不能執行該操作,那么它將自行寫入文件。 1.嘗試讀取文件2.如果文件不存在,則寫入文件

因此,對於異步模式,可能有多個進程由於無法讀取而要寫入文件。 我需要鎖定文件寫入,所有讀者都應該等待

文件鎖定是操作系統特定的東西。

類似Unix的系統

類Unix的系統通常支持flock()fcntl()lockf()系統調用。 但是,除了lockf咨詢鎖之外,它不是Posix標准的一部分,因此您需要查閱操作系統特定的文檔。

Linux文檔在這里:

請注意, fcntl()不僅可以執行鎖定操作,還可以執行許多操作。

還要注意,在大多數情況下,鎖定類Unix系統是建議性的,即需要共同努力。 雙方都必須參與,只是無視鎖定是有可能的。 強制鎖定是可能的,但在典型范例中不使用。

視窗

在Windows中,強制性文件鎖(帶有CreateFile共享模式)和范圍鎖LockFileEx是正常的,並且咨詢鎖不可用,盡管可以模擬(通常使用1字節范圍鎖位於0xffffffff0xffffffffffffffff鎖定的部分沒有)實際存在,因此這並不意味着文件那么大)。

備擇方案

您所描述的方案的另一種選擇是,簡單地創建一個具有不同名稱的文件,然后在完成后對其重命名。

例如,如果該文件名為“ data-20130719-112258-99823.csv”,而不是創建一個名為“ tmpdata-20130719-112258-99823.csv.tmp”的文件,則當其完全寫入后,將其重命名。

解決此問題的標准方法是寫入臨時文件名,然后在寫入完成后重命名該文件。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM