在整个文件系统中搜索和替换文件内容的提示

时间:2013-04-12 14:08:34

标签: c# .net file stream

我负责开发在生产服务器上运行的应用程序,它的目的是搜索和替换每个ini,xml和config文件扩展名中的某些特定字符串,我必须关心性能(总共150台服务器)。在更换之前我必须备份文件。有什么最好的方法来实现这一目标?顺便说一句,我可以使用Dot Net 4.0,但最好使用3.5因为没有每个服务器都有4.0但如果有一个严重的优势我可以更新到4.0。现在我在想这样的事情:

String[] arrayFiles = Directory.GetFiles(strFylesystem , strExtensao, SearchOption.AllDirectories);
        foreach (string s in arrayFiles ){
            File.Copy(pathOrigin + s, pathNew);
            searchFound = false;
            foreach (string line in File.ReadAllLines(pathNew + s){
                if (line.contains("string_searched")){
                    line.Replace("string_searched", new_string);
                    searchFound = true;
                }
                if (!searchFound){
                    File.Delete(pathNew + s);
                }
            }
        }

我找到了一些使用Lambda,PLINQ e Regular Expression的论坛。除了个人喜好之外,有些人会帮我提高表现吗?例如:如果不使用File.ReadAllLines我使用StreamReader进行开发,会有更好的效果吗?有没有办法从Windows中包装findStr并获得性能提升?

1 个答案:

答案 0 :(得分:0)

您的限制因素是磁盘访问速度,并且您无法做很多事情来加快速度。当然,使用Lambda表达式不会产生性能差异。

除非您有多个驱动器,否则并行搜索将无济于事。也就是说,让两个线程在同一个驱动器上的不同目录上工作可能会减慢速度,因为它们会争用磁盘访问。

一个潜在的问题是,当您枚举驱动器上的所有文件时,您正在驱动器上创建新文件。如果你不小心,你可能会陷入无限循环。也就是说,你读x.xml,创建一个新文件,x.new.xml,然后你找到x.new.xml,改变它等等。你可能最好扫描整个驱动器并建立一个列表您要更改的文件。然后浏览该列表,进行更改。

我建议您不要使用C#执行此操作。而是编写两个PowerShell脚本。第一个在驱动器中搜索符合条件的文件,并将这些文件名写入文件。第二个从该文件中读取文件名,并处理这些文件。有关示例,请参阅https://stackoverflow.com/a/60065/56778

这可能不会像C#程序那么快,但我怀疑它会慢得多。同样,您的限制因素是磁盘访问速度,而不是处理速度。而你的开发时间将是几个小时而不是几天。修改PowerShell脚本比修改C#程序更容易。