C# 通过StreamWriter或文件写入修改数据?

C# 通过StreamWriter或文件写入修改数据?,c#,.net,stream,streamwriter,binarywriter,C#,.net,Stream,Streamwriter,Binarywriter,我需要创建二进制数据文件。它不能一次创建,我需要序列化一些数据,然后返回并在头中写入偏移量。文件将舒适地放入内存(几兆字节)。我可以使用BinaryWriter并使用writer.Seek(x,SeekOrigin.Begin)返回写入偏移量吗?或者,写文件(然后修改)有什么好处?或者可能没有真正的区别?您应该创建一个压缩结构来表示头,而不是偏移到文件中。填写结构并将其写在文件的开头。一次性阅读结构也会更容易。我想我理解你的问题。您正在序列化程序其他部分的对象,在请求序列化之前,您不知道每个块有

我需要创建二进制数据文件。它不能一次创建,我需要序列化一些数据,然后返回并在头中写入偏移量。文件将舒适地放入内存(几兆字节)。我可以使用
BinaryWriter
并使用
writer.Seek(x,SeekOrigin.Begin)
返回写入偏移量吗?或者,写文件(然后修改)有什么好处?或者可能没有真正的区别?

您应该创建一个压缩结构来表示头,而不是偏移到文件中。填写结构并将其写在文件的开头。一次性阅读结构也会更容易。

我想我理解你的问题。您正在序列化程序其他部分的对象,在请求序列化之前,您不知道每个块有多大。。您不希望同时序列化所有这些文件,因为这可能会占用大量内存

因此,您希望在文件前面留出一些空间,将二进制数据分块写入,同时记录每个块的大小,然后返回并写入头以指示每个块的开始和停止位置

您提出的解决方案似乎是合理的,但我相信如果您返回到标头位置,BinaryWriter将覆盖,因此您需要在前面写一个空白字节,以便为自己留出写入标头的空间-

现在的问题是,你的头球有多大?你写了多少个空字节?这可能取决于必须序列化的对象的数量。听起来你的问题和以前一样

相反,我会按顺序打包您的数据,例如:

| --------- Chunk 1 ----------|--------- Chunk 2 -----------|
| length | name | ... | bytes | length | name | ... | bytes |

length参数编码该块的总长度,接下来是每个块的属性,然后是被序列化的实际对象的原始字节。

需要进行多少搜索?我认为,如果编写器使用的底层流是MemoryStream,而不是文件流,那么速度会更快。这样可以减少对磁盘的访问,并且可以一次性将完成的流写入磁盘。我不知道在对其余数据进行序列化(写入文件/流写入器)之前要在头中写入哪些值。问题仍然存在,如果我们将“写入偏移量”更改为“写入填充的头结构”,请向文件写入一个空结构。然后将记录偏移量的所有“内容”写入结构中。然后重写结构…(当然是偏移量为零)。