c# - 仅可在只写模式下请求追加访问

标签 c# file file-access system.io.file

我需要能够从也打开用于写入的文件中读取数据,此外,我需要打开可写文件进行追加,因为它可能非常大,我只需要向其中添加内容。所以我有这个代码:

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:只能在只写模式下请求附加访问权限。

如果我使用 FileMode.OpenOrCreate 而不是 FileMode.Append,我不会收到任何错误,但文件内容会丢失。

如何才能完成追加,同时又能够像这样打开文件进行共享?

最佳答案

How can I accomplish append but also be able to open the file for sharing like this?

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

就您而言,您需要将 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 .读取、FileShare.ReadWrite).

从技术上讲,您可以按原样保留 FileShare 值,但实际上不应该有一个以上的文件写入者,而且从您的问题的措辞方式看来反正这不是你想要的。因此,在上面,我将编写器更改为仅以 FileShare.Read 共享,并将读取器更改为仅使用 FileAccess.Read 打开文件,此外还修复了异常消息指示需要写入器的不正确的 FileAccess.ReadWrite

关于c# - 仅可在只写模式下请求追加访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65924978/

相关文章:

c# - 解释类型转换和转换 - 用简单的话来说有什么区别

c# - 如何摆脱 .net core 2.2 中的 CORS?

python - 为什么我的脚本不写入文件?

java - 通过java applet直接访问文件

vbscript - 使用 VBScript 和 FileSystemObject 对日志文件进行独占文件访问

c# - 连接字符串 : 'database' 中不支持关键字

c# - Physics2D.OverlapCircleAll 未检测到其他游戏对象

java - 使用 Java 将命令行结果写入文件

wpf - 从按钮单击事件运行外部 .exe(例如卸载程序)

go - 了解文件访问代码片段的 "Why"