如何仅使用文件流写入文件的某些部分?
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
的文件中。
我不想写整个文件,如果只有一小部分文件发生了变化,有没有办法只修改文件的一部分而不 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
的文件中。