Search code examples
c#filestreamstreamreaderstreamwriter

HowTo lock a file, read its content and overwrite it?


I need to read the content of a file and overwrite it while the file is locked. I don't want the file to be unlocked between read and write operations.

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???
  }
}

If I use two FileStreams, the file is cleared when instantiating the writer but the file will be briefly unlocked between the reader and writer instantiation.

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
}

Solution

  • If you keep open the original FileStream you can do it:

    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
      }
    }