其他程序的二进制 Reader 和 Filemode.Open 块文件

Binary Reader with Filemode.Open Blocks file for other programs

我正在尝试为 .wav 音频文件制作一个标记解决方案。

因此我需要打开文件来读出它的标签。 其代码开头如下:

this.Reader = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read));
this.RiffId = Encoding.ASCII.GetString(Reader.ReadBytes(4)); // excluding 8 bit header
this.FileSize = Reader.ReadInt32(); // size of entire file (4 bytes)
this.FileType = Encoding.ASCII.GetString(Reader.ReadBytes(4));

据我了解,这将正常打开文件只读?但是,当我在我的应用程序中打开音频文件时,媒体播放器吐出一个错误,指出该文件被我的程序阻止:

我希望文件只读,写入将始终是文件的完整副本。

在收听音频以标记文件时,有必要同时在两个程序中读取文件。 在收听文件时关闭文件并不容易,因为我想让我的应用程序保持响应。来自 riff 块的附加数据仅在必要时加载并存储在缓冲区中。

this.Reader = new BinaryReader(File.Open(path,FileMode.Open,FileAccess.Read,FileShare.Read));

FileMode.Open 指定如何处理文件。更多关于 https://docs.microsoft.com/en-us/dotnet/api/system.io.filemode?view=net-5.0

一些例子: 打开 3
指定操作系统应打开现有文件。打开文件的能力取决于 FileAccess 枚举指定的值。如果文件不存在,则抛出 FileNotFoundException 异常。

追加 6
打开文件(如果存在)并查找到文件末尾,或者创建一个新文件。这需要追加权限。 FileMode.Append 只能与 FileAccess.Write 结合使用。试图查找到文件末尾之前的位置会抛出 IOException 异常,任何读取尝试都会失败并抛出 NotSupportedException 异常。

截断 5
指定操作系统应打开现有文件。打开文件时,应将其截断,使其大小为零字节。这需要写权限。尝试从使用 FileMode.Truncate 打开的文件读取会导致 ArgumentException 异常。

FileAccess 指定您自己的文件访问权限 https://docs.microsoft.com/en-us/dotnet/api/system.io.fileaccess?view=net-5.0

FileShare 指定其他线程对文件的访问权限 https://docs.microsoft.com/en-us/dotnet/api/system.io.fileshare?view=net-5.0