C# 读取、修改,然后将二进制数据写入文件.最好的约定

本文关键字:文件 约定 数据 二进制 读取 修改 然后 | 更新日期: 2023-09-27 18:36:41

我是编程新手(我对编程概念的理解仍在增长。所以这个问题是关于学习的,所以请提供足够的信息让我学习,但不要太多,以至于我不能,谢谢。(我还想输入有关如何使代码在项目中可重用的信息。

我正在从事的项目的目标包括:

  1. 读取二进制文件。

  2. 我已经知道我需要读取偏移量才能从此文件中查找特定的数据块。

  3. 第一个偏移量是前 4 个字节(偏移量为我的块的末尾)。

  4. 第二个偏移量是文件末尾的 16 个字节。我读了 4 个字节。(以十六进制给出块的大小)。

  5. 第三个偏移量是前一个之后的 4 个字节,读取 4 个字节(十六进制中块开头的偏移量)。

  6. 通过搜索 ASCII 文本和偏移量来查找要修改的块中的部分。

现在我有了块的开始偏移量、结束偏移量和大小。这应该允许我将字节从文件读取到字节数组中,并提前知道数组的大小。

(问题:1.知道尺寸重要吗?除了验证。2. 将文件的一部分读取到字节数组中以更改字节并覆盖文件的该部分是最好的方法吗?

到目前为止,我已经设法在MemoryStream上使用BinaryReader从文件中读取偏移量。然后,我找到我需要的数据块并将其读取到字节数组中。

我陷入了以下几种情况:

  • 二进制读取/写入的最佳实践是什么?
  • 读取的数据的最佳存储约定是什么?
  • 当我需要修改字节时,我该怎么做。
  • 我应该使用 FileStream 吗?

C# 读取、修改,然后将二进制数据写入文件.最好的约定

由于你想要读取和写入,所以直接使用 FileStream 类(使用 FileMode.Open 和 FileAccess.ReadWrite)是有意义的。 请参阅 MSDN 上的 FileStream 以获取一个很好的整体示例。

  1. 您确实需要知道要从流中读取的字节数。 请参阅 FileStream.Read 文档。
  2. 从根本上说,如果您要使用并稍后修改其内容,则必须在某个时候将字节读入内存。 因此,您必须制作内存中的副本(如果您一次读取可变长度的块,则使用 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.
}