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

时间:2016-05-23 17:53:44

标签: c# filestream

如果只有一小部分文件发生了变化,我不想写一个完整的文件,有没有办法只修改文件的一部分而不打开/重写整个文件?该文件将是32mb并且没有插入/删除,仅覆盖。

例如,这里我有一个32mb文件,只有大约1mb的数据发生了变化,将整个文件加载到内存并重新保存似乎效率低下。在c#中有没有办法打开/只读取文件的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,所以没有插入/删除,只是覆盖。

1 个答案:

答案 0 :(得分:0)

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

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

这会在bytes的{​​{1}}处的offset处写path