我想替换文件中的一些数据,但是我不确切知道这个200MB文件将包含它的确切位置。是否可以在不将200mb +文件加载到内存中的情况下找到(并用其他东西替换)这些值?
答案 0 :(得分:3)
搜索文件不是问题。您需要的是使用可通过File.Open方法获得的FileStream。您可以通过文件读取最多需要替换的字节。 当您需要插入某些内容时会出现问题。 FileStream允许您覆盖特定字节中的部分或全部文件内容,并将新内容附加到其末尾,但它不允许您在文件中间插入数据。为了克服这个问题,您需要一个临时文件。如果您同意,您可以执行以下操作:
您可以使用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)
只是一个想法,如何逐行读取文件或者如果你有需要替换的数据,可以在每个块中查看。另外,在读取时确保获取文件指针直到你已经读取文件的位置,这样当你找到匹配时,你可以回到那个位置然后写下你所针对的那些确切字节。