我有一個文件,粗略地說,包含應用程序的狀態。鎖定文件,同時保留在同一個線程中讀取/附加/寫入/截斷的能力?
我要實現以下行爲:
- 當應用程序被啓動,鎖定文件,以使其他應用程序(或用戶本身)將能夠修改它;
- 從文件讀取以前的應用程序狀態;
- ...做的工作...
- 更新一個新的狀態文件(假定該文件的格式,包括重寫整個文件,該文件的長度可能在手術後下降);
- ...做的工作...
- 再次更新文件
- ...做的工作...
- 如果工作失敗(應用程序崩潰),鎖被取下,並且內容的文件保持原先的工作單元執行後的狀態。
看來,要重寫該文件,應該打開一個Truncate
選項;這意味着每次他們要重寫一個文件時都應該打開一個新的FileStream
。如此看來,行爲我想只能通過這種骯髒的方式來實現:
- 當應用程序被啓動,讀取該文件,然後打開的
FileStream
與FileShare.Read
; - 當一些工作完成後,關閉先前打開的手柄,打開另一個
FileStream
與FileMode.Truncate
和FileShare.Read
,寫入數據並刷新FileStream
。 - 當一些工作完成後,關閉先前打開的手柄,打開另一個
FileStream
與FileMode.Truncate
和FileShare.Read
,寫入數據並刷新FileStream
。 - 在
Dispose
,關閉句柄曾被打開。
這種方式也有一些缺點:額外FileStream
被打開;在FileStream
關閉和FileStream
打開之間的文件完整性不保證;代碼要複雜得多。 有沒有其他方法,缺乏這些缺點?
'FileStream.SetLength'正是我一直在尋找的! – penartur 2012-03-20 04:42:47