如果只有一小部分文件发生了变化,我不想写一个完整的文件,有没有办法只修改文件的一部分而不打开/重写整个文件?该文件将是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,所以没有插入/删除,只是覆盖。
答案 0 :(得分:0)
要通过逐个覆盖字节来修改文件中完全在文件中的部分,您可以使用以下代码:
using (var fileStream = File.OpenWrite(path)) {
fileStream.Seek(offset, SeekOrigin.Begin);
fileStream.Write(bytes, 0, bytes.Length);
}
这会在bytes
的{{1}}处的offset
处写path
。