如何仅使用文件流写入文件的某些部分?

How can I write to certain sections of a file only with filestream?

我不想写整个文件,如果只有一小部分文件发生了变化,有没有办法只修改文件的一部分而不 opening/rewriting 整个文件?该文件将变为 32mb,没有 inserts/deletes,只是覆盖而已。

例如,我这里有一个32mb的文件,其中只有大约1mb的数据发生了变化,将整个文件加载到内存中并重新保存似乎效率很低。在 C# 中,有没有一种方法可以 open/read 仅文件的 1 个部分并仅修改该部分?

using (var fileStream = new FileStream ("testfile.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
{
    fileStream.SetLength (totalDummyFileSize); //create 32mb file
    //just dummy data for testing
    fileStream.Write(new byte[lookupTableSizeInBytes],0,lookupTableSizeInBytes); 
    fileStream.Seek (datatToWriteLocation, SeekOrigin.Current);
    fileStream.Write(dataToWrite, 0, dataToWrite.Length);
}

然后尝试阅读:

using (var fileStream = new FileStream ("testfile.dat", FileMode.Open, FileAccess.Read, FileShare.None)) 
{
        fileStream.Seek(dataLocation,SeekOrigin.Current);
        fileStream.Read(data, 0, data.Length);
}

但是当我尝试读取上次写入的位置时,数据不存在。

编辑:文件大小永远不会改变,它永远是 32mb,所以没有 inserting/deleting,只是覆盖。

要通过逐个覆盖字节来修改完全在文件中的文件部分,您可以使用此代码:

using (var fileStream = File.OpenWrite(path)) {
  fileStream.Seek(offset, SeekOrigin.Begin);
  fileStream.Write(bytes, 0, bytes.Length);
}

这会将 bytes at offset 写入位于 path 的文件中。