【问题标题】:Read and write from/to the same line with BinaryReader/BinaryWriter使用 BinaryReader/BinaryWriter 从/向同一行读取和写入
【发布时间】:2020-02-20 18:48:27
【问题描述】:

我想逐行读取二进制文件(我当然是在连续写入,但我知道在 457 字节后新数据开始,我确切知道字节结构以及写入信息的位置)并更改行的特殊入口。当我尝试使用 BinaryReader 和 BinaryWriter 访问同一个文件时,我得到一个 System.IO.IOException。我使用锁定来防止从其他地方访问文件。

我的代码是:

using (FileStream fs2 = new FileStream(testfile, FileMode.Open, FileAccess.Read))
{
    using (BinaryReader r = new BinaryReader(fs2))
    {
        using (BinaryWriter bw = new BinaryWriter(new FileStream(testfile, FileMode.Open, FileAccess.Write), utf8))
        {
            for (int i = 0; i < 11000; i+=457)
            {
                int myint = r.ReadInt64();
                bw.Seek(i, SeekOrigin.Current);
                bw.Write(myint*2);
            }
        }
    }
}

我该怎么做?

【问题讨论】:

  • 如何逐行读取二进制文件?在这种情况下,二进制文件是什么意思?是什么样的二进制文件?
  • 如何逐行读取二进制文件?你能澄清一下你想要达到的目标吗?
  • 代码没有指定要使用的FileShare,当文件已经打开写入时默认拒绝读取。正确的方法是使用 FileAccess.ReadWrite 并让 BinaryReader 和 writer 使用相同的流。请注意,FileShare.ReadWrite 太危险了,因为它还允许另一个进程弄乱该文件。
  • 好像哪里有重复。
  • 你能不能打开你的文件来读取,打开一个不同的文件来写入,然后当你完成任何你想要做的改变后,删除原始文件并重命名新文件?或者试试这个stackoverflow.com/questions/605685/…

标签: c# binaryreader binarywriter


【解决方案1】:

不要创建第二个 FileStream,因为该文件已被第一个 FileStream 对象锁定以进行读取操作。
如果您确定文件结构,则异常只能来自第二个 FileStream 实例化。有关更多信息,请参阅以下链接:
Read and Write to File at the same time

【讨论】:

    【解决方案2】:

    使用以下代码对我有用:

    if (File.Exists(testfile))
    {
          FileInfo fi = new FileInfo(testfile);
    
          using (FileStream fs2 = new FileStream(testfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
          {
              using (BinaryReader r = new BinaryReader(fs2))
              {
                  r.BaseStream.Seek(0, SeekOrigin.Begin);                       
                  using (BinaryWriter bw = new BinaryWriter(new FileStream(testfile, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)))                        
                  {
                      for (int i = 0; i <= (fi.Length-177); i += 177)//181
                      {
                      }
                  }
              }
          }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多