Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时读写二进制文件_C#_.net_Vb.net_Io_Binary - Fatal编程技术网

C# 同时读写二进制文件

C# 同时读写二进制文件,c#,.net,vb.net,io,binary,C#,.net,Vb.net,Io,Binary,我想同时写入和读取二进制文件,但每当我尝试这样做时,总会出现一个异常,表明该文件已被另一个进程使用。我知道如何使用普通的FileStream,但是使用BinaryReader和BinaryWriter它不起作用 有人知道如何同时读写二进制文件吗 到目前为止我所做的: FileSt=newfilestream(“file.bin”、FileMode.Create、FileAccess.ReadWrite) writer=新的二进制writer(FileSt,enc) reader=newbinar

我想同时写入和读取二进制文件,但每当我尝试这样做时,总会出现一个异常,表明该文件已被另一个进程使用。我知道如何使用普通的
FileStream
,但是使用
BinaryReader
BinaryWriter
它不起作用

有人知道如何同时读写二进制文件吗

到目前为止我所做的:

FileSt=newfilestream(“file.bin”、FileMode.Create、FileAccess.ReadWrite)
writer=新的二进制writer(FileSt,enc)
reader=newbinaryreader(File.Open(“File.bin”,FileMode.Open))

您需要使用能够提供模式的
文件流

查看MSDN对
FileShare.ReadWrite
模式的说明:

允许随后打开文件进行读取或写入。如果这 未指定标志,任何打开文件以进行读取或删除的请求 写入(通过此进程或其他进程)将失败,直到文件 关门了。但是,即使指定了此标志,附加的 访问该文件可能仍然需要权限

        FileStream blah = new FileStream("file.bin", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

您需要使用能够提供模式的
FileStream

查看MSDN对
FileShare.ReadWrite
模式的说明:

允许随后打开文件进行读取或写入。如果这 未指定标志,任何打开文件以进行读取或删除的请求 写入(通过此进程或其他进程)将失败,直到文件 关门了。但是,即使指定了此标志,附加的 访问该文件可能仍然需要权限

        FileStream blah = new FileStream("file.bin", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

您需要在文件上设置文件共享模式

        FileStream blah = new FileStream("file.bin", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

您需要在文件上设置文件共享模式

        FileStream blah = new FileStream("file.bin", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

您将打开文件两次—一次用于读取,一次用于写入。这意味着一个
FileStream
需要
FileAccess.Read
FileShare.Write
,而另一个需要
FileAccess.Write
FileShare.Read
。使用已使用
二进制编写器写入
整数和
字符串的文件测试和验证此代码:

Dim filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test.bin")

Using source = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Write),
      destination = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read),
      reader As New BinaryReader(source),
      writer As New BinaryWriter(destination)
    Dim n = reader.ReadInt32()

    writer.Write(98765)
    writer.Write("What's up doc?")

    Dim sz = reader.ReadString()
End Using

请注意,如果只需要指定
Read
Write
,则只需指定。仅当您知道您将或可能需要两者时才指定
ReadWrite
FileAccess
值表示此
FileStream
将对文件执行或可能执行的操作,
FileShare
值表示允许在同一文件上打开的其他
FileStream
对象执行的操作。

您将打开文件两次,一次用于读取,一次用于写入。这意味着一个
FileStream
需要
FileAccess.Read
FileShare.Write
,而另一个需要
FileAccess.Write
FileShare.Read
。使用已使用
二进制编写器写入
整数和
字符串的文件测试和验证此代码:

Dim filePath As String = Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Test.bin")

Using source = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Write),
      destination = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.Read),
      reader As New BinaryReader(source),
      writer As New BinaryWriter(destination)
    Dim n = reader.ReadInt32()

    writer.Write(98765)
    writer.Write("What's up doc?")

    Dim sz = reader.ReadString()
End Using

请注意,如果只需要指定
Read
Write
,则只需指定。仅当您知道您将或可能需要两者时才指定
ReadWrite
FileAccess
值用于此
FileStream
将对文件执行或可能执行的操作,而
FileShare
值用于允许在同一文件上打开的其他
FileStream
对象执行的操作。

fidemrazizer:即使使用FileShare.ReadWrite,我也可以执行相同的操作error@Eggord我对此表示怀疑。事实上,您正在使用不同的标志打开整个文件两次。尝试使用
FileShare.ReadWrite
打开这两个文件,然后查看发生了什么FidemRazer:即使使用FileShare.ReadWrite,我也会得到相同的结果error@Eggord我对此表示怀疑。事实上,您正在使用不同的标志打开整个文件两次。尝试使用
FileShare.ReadWrite
打开这两个文件,并查看在提供的答案之后发生的情况。如果您打算打开同一个文件两次,一次用于阅读,一次用于写入,则应使用
FileAccess.Read
作为一个文件,另一个使用
FileAccess.Write
。另外,不要用
FileStream
构造函数打开文件一次,也不要用
file.open打开文件一次。保持一致,两次使用相同的方法。此外,使用
块打开文件,这样当您使用完文件后,它就可以隐式关闭。根据提供的答案,如果您打算打开同一文件两次,一次用于读取,一次用于写入,那么您应该使用
文件访问。读取
一次,写入
另一次。另外,不要用
FileStream
构造函数打开文件一次,也不要用
file.open打开文件一次。保持一致,两次使用相同的方法。另外,使用
块打开带有
的文件,以便在完成后可以隐式关闭该文件。正如其他人所指出的,还需要更改第二次打开:FileStream binaryReaderFile=file.open(“file.bin”,FileMode.open,FileAccess.Read,FileShare.ReadWrite);正如其他人所指出的,您还需要更改第二个打开:FileStream binaryReaderFile=File.open(“File.bin”,FileMode.open,FileAccess.Read,FileShare.ReadWrite);