【问题标题】:Simultaneously read and write binary file同时读写二进制文件
【发布时间】:2016-12-09 19:22:54
【问题描述】:

我想同时写入和读取一个二进制文件,但是每当我尝试这样做时,我总是得到一个异常,指出该文件已被另一个进程使用。我知道如何使用普通的 FileStream 来做到这一点,但使用 BinaryReaderBinaryWriter 就不行了。

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

到目前为止我做了什么:

FileSt = New FileStream("file.bin", FileMode.Create,FileAccess.ReadWrite)
writer = New BinaryWriter(FileSt, enc)
reader = New BinaryReader(File.Open("file.bin", FileMode.Open))

【问题讨论】:

  • 除了提供的答案之外,如果您打算打开同一个文件两次 - 一次用于读取,一次用于写入 - 那么您应该使用 FileAccess.ReadFileAccess.Write 另一个。此外,不要使用FileStream 构造函数打开文件一次,也不要使用File.Open 打开文件一次。保持一致并两次使用相同的方法。另外,使用Using 块打开文件,以便在完成后可以隐式关闭它。

标签: c# .net vb.net io binary


【解决方案1】:

您需要使用可以提供FileShare模式的FileStreamconstructor overload

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

允许随后打开文件以进行读取或写入。如果这 未指定标志,任何打开文件进行读取的请求或 写入(通过此进程或另一个进程)将失败,直到文件 已经关闭。然而,即使指定了这个标志,额外的 访问该文件可能仍需要权限。

【讨论】:

  • Fidemraizer:即使使用 FileShare.ReadWrite 我也会遇到同样的错误
  • @Eggord 我对此表示怀疑。实际上,您使用不同的标志两次打开整个文件。尝试使用FileShare.ReadWrite 打开两者,看看会发生什么
【解决方案2】:

您打开文件两次 - 一次用于读取,一次用于写入。这意味着一个FileStream 需要FileAccess.ReadFileShare.Write,而另一个需要FileAccess.WriteFileShare.Read。此代码已使用已写入 IntegerString 的文件以及 BinaryWriter 进行测试和验证:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 正如其他人所说,您还需要更改第二次打开: FileStream binaryReaderFile = File.Open("file.bin", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    猜你喜欢
    • 2012-01-26
    • 2018-07-26
    • 2016-06-14
    • 2021-06-03
    • 2019-04-20
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多