c# - 编辑大型二进制文件

标签 c# c++ file

我正忙于一个小项目,它有很多数据,如图像文本文件和其他东西,我试图将它们全部打包到一个大文件或多个大文件中,这样程序文件夹看起来就不会凌乱。

但问题是我该如何编辑这些文件。我考虑过文件结构,它会是这样的:

[DWORD] Number of files

     [DWORD]FileId
     [STRING]FileName
     [DWORD]FileSize
     [DWORD]FileIndex

[BYTES]All the files

所以第一部分获取所有文件的列表太快了,FileIndex 是二进制文件中的位置,因此我也可以设置指针(例如 300)并读取文件。

但是如果我想创建一个补丁并对其进行编辑,我将不得不读取我正在编辑的文件之后的所有字节并将它们全部复制回来,这可能需要几个文件才能花费很长时间。

插入所有文件后,二进制文件可能只有几百 MB。

那么其他程序如何做到这一点,例如游戏使用这些大文件并打补丁,是否有某种技巧可以更快地插入额外字节?

最佳答案

在文件中间插入字节没有“技巧”。

通常解决方案涉及将文件添加到文件末尾,然后切换它们在索引中的位置。然后你会遇到必须对文件进行碎片整理的问题。您可以将文件分成大块,这可以减轻一些碎片整理问题,但文件不连续。

如果您正在处理非静态数据,我不建议您这样做,除非您绝对必须这样做。我见过非常出色的软件工程师花费大量时间来编写合理的实现。

使用 sqlite 作为虚拟文件系统可能是一个可行的解决方案。但话说回来,将数据文件放在另一个文件夹中也是如此,这样看起来就不会“乱七八糟”。

关于c# - 编辑大型二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919748/

相关文章:

c# - 无法在我的 DataGrid 中使用类型化的 DataRowView

c# - 使用 Parallel 创建绑定(bind)项时 CollectionViewSource.SortDescriptions 不起作用

c++ - 如何显示图的邻接表的元素?

c++ - jsoncpp链接问题

python - 如何修复 Anaconda 找不到的 : pyconfig. h

java - 如何为文件添加签名?

java - 如何比较 Java 中的路径等价性?

c# - Entity Framework 中未填充外键

c# - 使用私有(private)还是使用属性? C#

c - fsetpos 未按预期设置文件指针的位置