我想替换文件中的一些数据,但我不知道这个 200MB 的文件到底包含它的位置。是否可以在不将 200mb 以上的文件加载到内存中的情况下找到(并用其他内容替换它们)这些值?
最佳答案
搜索文件没有问题。您需要的是使用 FileStream,可通过 File.Open 获取该文件流。方法。您可以通读文件直至需要替换的字节。 当您需要插入某些东西时就会出现问题。 FileStream 允许您从特定字节开始覆盖部分或全部文件内容,并将新内容附加到其末尾,但它不允许您在文件中间插入数据。为了解决这个问题,您将需要一个临时文件。如果您同意,您可以执行以下操作:
- 打开原始文件上的 FileStream。
- 创建一个临时文件来保存草稿版本。
- 搜索原始文件并将所有“良好”数据复制到临时文件中,直到要进行修改的位置。
- 将修改后的数据和新数据插入临时文件。
- 使用原始文件中剩余的“良好”内容完成临时文件。
- 用临时文件替换原始文件。
- 删除临时文件。
您可以使用Path.GetTempFileName方便地利用临时文件的方法。
附注如果您修改 exe,那么您可能会替换文本常量,并且既不需要插入新字节,也不需要删除任何字节。在这种情况下,您不需要费心处理临时文件,FileStream 就足够了。
P.P.S。使用 FileStream,您可以决定从文件读取并写回的缓冲区的大小。请记住,此大小是内存消耗、I/O 性能和代码复杂性之间的权衡。做出明智的选择。我会第一次将其设置为每个字节,并尝试优化将缓冲区增加到工作时的 64k。您可以依靠 FileStream 来缓冲数据;每次您向其请求另一个字节时,它不会执行磁盘 I/O。如果您自己进行缓冲,请尽量不要将 Large Object Heap 碎片化。 。 .NET 4.5 的阈值是 85000 字节。
关于c# - 查找并替换文件中的数据(不加载整个文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26107585/