只能在只写模式下请求追加访问

问题描述

我需要能够读取一个也可以写入的文件,此外,我需要为 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 打开文件如异常消息所示需要。