问题描述
我需要能够读取一个也可以写入的文件,此外,我需要为 Append 打开可写文件,因为它可能非常大,我只需要向其中添加。所以我有这个代码:
var file = @"...";
var fsWrite = new FileStream(file,FileMode.Append,FileAccess.ReadWrite,FileShare.ReadWrite);
var writer = new SmartWaveFileWriter(fsWrite,WaveInfo.WatsonWaveFormat);
var fsRead = new FileStream(file,FileMode.Open,FileShare.ReadWrite);
var reader = new SmartWaveFileReader(fsRead);
reader.dispose();
fsRead.dispose();
writer.dispose();
fsWrite.dispose();
这失败了 System.ArgumentException: Append access can be requested only in write-only mode.
如果我使用 FileMode.Append
而不是 FileMode.OpenorCreate
,则不会出错,但文件内容会丢失。
如何在完成追加的同时还能像这样打开文件进行共享?
解决方法
如何在完成追加的同时还能像这样打开文件进行共享?
不要将“访问”与“共享”混淆。 FileAccess
枚举描述了您的进程希望如何使用该文件。 FileShare
枚举描述了other 对文件的处理(包括您自己进程中的处理)可以对文件执行的操作。
在您的情况下,您需要将 new FileStream(file,FileMode.Append,FileAccess.ReadWrite,FileShare.ReadWrite)
更改为 new FileStream(file,FileAccess.Write,FileShare.Read)
,并将 new FileStream(file,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
。
从技术上讲,您可以按原样保留 FileShare
值,但一个文件中确实不应该有多个作者,而且从您的问题的措辞来看,这似乎不是你想要什么。所以在上面,除了为作者修复不正确的 FileShare.Read
之外,我已经将作者更改为仅以 FileAccess.Read
共享,而读者仅使用 FileAccess.ReadWrite
打开文件如异常消息所示需要。