首页 > 解决方案 > 只能在只写模式下请求附加访问

问题描述

我需要能够从一个也可以写入的文件中读取,此外,我需要为 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, FileAccess.ReadWrite, 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,我不会出错,但文件的内容会丢失。

我怎样才能完成追加,但也能够像这样打开文件进行共享?

标签: c#filefile-accesssystem.io.file

解决方案


我怎样才能完成追加,但也能够像这样打开文件进行共享?

不要将“访问”与“共享”混淆。FileAccess枚举描述了您的进程希望如何使用该文件。FileShare枚举描述了文件的其他句柄(包括您自己进程中的句柄)可以对文件执行的操作。

在您的情况下,您需要更改new FileStream(file, FileMode.Append, FileAccess.ReadWrite, FileShare.ReadWrite)new FileStream(file, FileMode.Append, FileAccess.Write, FileShare.Read)并更改new FileStream(file, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite).

从技术上讲,您可以FileShare按原样保留这些值,但一个文件的作者实际上不应超过一位,而且从您的问题的措辞方式来看,这似乎不是您想要的。因此,在上面,我已将编写器更改为仅共享为FileShare.Read,而阅读器仅使用 来打开文件FileAccess.Read,此外还修复FileAccess.ReadWrite了异常消息表明需要编写器的错误。


推荐阅读