【问题标题】:HowTo lock a file, read its content and overwrite it? [duplicate]如何锁定文件,读取其内容并覆盖它? [复制]
【发布时间】:2017-08-02 16:49:48
【问题描述】:

我需要读取文件的内容并在文件被锁定时覆盖它。我不希望文件在读写操作之间被解锁。

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
  using (var reader = new StreamReader(file, Encoding.Unicode))
  using (var writer = new StreamWriter(file, Encoding.Unicode))
  {
    // read
    // calculate new content
    // overwrite - how do I do this???
  }
}

如果我使用两个FileStreams,则在实例化写入器时会清除文件,但会在读取器和写入器实例化之间短暂解锁文件。

using (var reader = new StreamReader(new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None)))
{
  // read
  // calculate new content
}

using (var writer = new StreamWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)))
{
  // write
}

【问题讨论】:

    标签: c# filestream streamreader streamwriter


    【解决方案1】:

    如果你保持打开原始文件流,你可以这样做:

    using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
    {
       // This overload will leave the underlying stream open
      using (var reader = new StreamReader(file, Encoding.Unicode, true, 4096, true))
      {
          //Read
      }
    
      file.SetLength(0); //Truncate the file and seek to 0
    
      using (var writer = new StreamWriter(file, Encoding.Unicode))
      {
            //Write the new data
      }
    }
    

    【讨论】:

    • 这依赖于 v4.5,因为在它之前没有带有 leaveOpen 的 ctor。
    • 感谢您的快速回答!
    • 没有理由使用新的leaveOpen 参数来解决这个问题。以读/写方式打开文件就足够了。读取器和写入器可以同时创建,底层流长度设置在读取之后,写入之前。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2019-05-04
    • 2022-06-11
    • 2011-12-16
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多