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

时间:2014-09-29 19:41:00

标签: c# file replace

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

2 个答案:

答案 0 :(得分:3)

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

  1. 打开原始文件上的FileStream。
  2. 创建一个包含草稿版本的临时文件。
  3. 搜索原始文件并复制所有" good"将数据转换为临时文件,直至进行修改。
  4. 将修改后的数据和新数据插入临时文件中。
  5. 使用剩余的" good"完成临时文件。来自原始文件的内容。
  6. 将原始文件替换为临时文件。
  7. 删除临时文件。
  8. 您可以使用Path.GetTempFileName方法来方便地使用临时文件。

    P.S。如果修改了exe,那么你可能会对文本常量进行替换,既不需要插入新字节也不需要删除任何字节。在这种情况下,您不需要打扰临时文件,只需要FileStream即可。

    P.P.S。使用FileStream,您可以决定从文件中读取的缓冲区的大小并进行回写。请记住,此大小是内存消耗,I / O性能和代码复杂性之间的权衡。做出明智的选择。我会第一次按字节进行,并尝试优化增加缓冲区,使其在工作时说64k。您可以依靠FileStream来缓冲数据;每次从它请求另一个字节时,它都不会执行磁盘I / O.如果您自己进行缓冲,请尽量不要对Large Object Heap进行分段。 .NET 4.5的阈值是85000字节。

答案 1 :(得分:1)

只是一个想法,如何逐行读取文件或者如果你有需要替换的数据,可以在每个块中查看。另外,在读取时确保获取文件指针直到你已经读取文件的位置,这样当你找到匹配时,你可以回到那个位置然后写下你所针对的那些确切字节。