查找并替换文件中的数据(不加载整个内容)

本文关键字:加载 替换 文件 数据 查找 | 更新日期: 2023-09-27 18:25:09

我想替换文件中的一些数据,但我不知道这个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。如果你自己进行缓冲,那么尽量不要分割大对象堆。.NET 4.5的阈值为85000字节。

想一想,逐行读取文件,或者以字节为单位读取文件,看看每个块中是否有需要替换的数据。此外,在读取时,请确保将文件指针移到读取文件的位置,这样当你找到匹配项时,你就可以回到那个位置,重写你所指向的确切字节。