由于您既要读取又要写入,因此直接使用 FileStream 类(使用 FileMode.Open 和 FileAccess.ReadWrite)是有意义的。请参阅MSDN 上的 FileStream 以获得一个很好的整体示例。
- 您确实需要知道将从流中读取的字节数。请参阅FileStream.Read 文档。
- 从根本上说,如果您要使用并稍后修改它们的内容,则必须在某个时候将字节读入内存。因此,您必须制作一个内存副本(如果您一次读取可变长度的块,则使用 Read 方法是正确的方法)。
至于最佳实践,请务必在完成后处理您的流;例如:
using (var stream = File.Open(FILE_NAME, FileMode.Open, FileAccess.ReadWrite))
{
//Do work with the FileStream here.
}
如果你要做大量的工作,你应该异步地做这些工作。(让我们知道是否是这种情况。)
当然,在使用这些方法之前,请查看 FileStream.Read 文档和FileStream.Write 文档。
读取字节最好通过预先分配一个内存中的字节数组来完成,该数组具有您要读取的长度,然后读取这些字节。以下将读取您感兴趣的字节块,让您对其进行处理,然后替换原始内容(假设块的长度没有改变):
编辑:根据对变量范围的评论,我添加了一个辅助方法来处理块。
using (var stream = File.Open(FILE_NAME, FileMode.Open, FileAccess.ReadWrite))
{
var chunk = new byte[numOfBytesInChunk];
var offsetOfChunkInFile = stream.Position; // It sounds like you've already calculated this.
stream.Read(chunk, 0, numOfBytesInChunk);
DoWorkOnChunk(ref chunk);
stream.Seek(offsetOfChunkInFile, SeekOrigin.Begin);
stream.Write(chunk, 0, numOfBytesInChunk);
}
private void DoWorkOnChunk(ref byte[] chunk)
{
//TODO: Any mutation done here to the data in 'chunk' will be written out to the stream.
}