【发布时间】:2012-03-19 04:35:38
【问题描述】:
我有一个文件,大致包含应用程序的状态。
我想实现以下行为:
- 应用程序启动时,锁定文件,使其他应用程序(或用户本身)无法修改它;
- 从文件中读取之前的应用程序状态;
- ...做工作...
- 使用新状态更新文件(根据文件的格式,这涉及重写整个文件;操作后文件的长度可能会减少);
- ...做工作...
- 再次更新文件
- ...做工作...
- 如果工作失败(应用程序崩溃),则解除锁定,文件的内容将保持上一个工作单元执行后的状态。
看来,要重写文件,应该使用Truncate 选项打开它;这意味着人们每次想要重写文件时都应该打开一个新的FileStream。所以看来我想要的行为只能通过这种肮脏的方式来实现:
- 应用程序启动后,读取文件,然后用
FileShare.Read打开FileStream; - 完成一些工作后,关闭之前打开的句柄,用
FileMode.Truncate和FileShare.Read打开另一个FileStream,写入数据并刷新FileStream。 - 完成一些工作后,关闭之前打开的句柄,用
FileMode.Truncate和FileShare.Read打开另一个FileStream,写入数据并刷新FileStream。 - 在
Dispose上,关闭之前打开的句柄。
这种方式有一些缺点:打开了额外的FileStream;在FileStream close 和FileStream open 之间不能保证文件的完整性;代码要复杂得多。
有没有其他方法,没有这些缺点?
【问题讨论】: