c# - 查找并替换文件中的数据(不加载整个文件)?

标签 c# file replace

我想替换文件中的一些数据,但我不知道这个 200MB 的文件到底包含它的位置。是否可以在不将 200mb 以上的文件加载到内存中的情况下找到(并用其他内容替换它们)这些值?

最佳答案

搜索文件没有问题。您需要的是使用 FileStream,可通过 File.Open 获取该文件流。方法。您可以通读文件直至需要替换的字节。 当您需要插入某些东西时就会出现问题。 FileStream 允许您从特定字节开始覆盖部分或全部文件内容,并将新内容附加到其末尾,但它不允许您在文件中间插入数据。为了解决这个问题,您将需要一个临时文件。如果您同意,您可以执行以下操作:

  1. 打开原始文件上的 FileStream。
  2. 创建一个临时文件来保存草稿版本。
  3. 搜索原始文件并将所有“良好”数据复制到临时文件中,直到要进行修改的位置。
  4. 将修改后的数据和新数据插入临时文件。
  5. 使用原始文件中剩余的“良好”内容完成临时文件。
  6. 用临时文件替换原始文件。
  7. 删除临时文件。

您可以使用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/

相关文章:

c# - 关于 model-view-presenter (C#) 的一般性问题,模型应该知道 presenter 吗?

c# - 关于Singleton C#的两个问题

iOS 应用程序 : open a file, 将其发送到网络位置,然后返回调用应用程序

java - 无法获取多个文件的最常用单词

file - 如何使用golang将文件移动到另一个文件夹/路径

c# - 如何构建 WCF Web 服务解决方案,以便轻松以不同方式进行开发和托管?

c# - 复杂类型参数属性未发生 Web Api 数据注释验证

linux - 使用 awk 修改文本

python - re.sub() 具有具有副作用的替换功能

regex - 我如何使用 vim 替换所有匹配正则表达式的整行