【问题标题】:Tips for searching and replacing file contents in entire filesystem在整个文件系统中搜索和替换文件内容的提示
【发布时间】:2013-04-12 14:08:33
【问题描述】:

我负责开发一个在生产服务器上运行的应用程序,它旨在搜索和替换每个 ini、xml 和配置文件扩展名中的一些特定字符串,我必须关心性能(总共 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 和正则表达式。除了个人喜好之外,这些对我的表现有帮助吗?例如:如果我使用StreamReader 开发而不是使用File.ReadAllLines,性能会更好吗?有没有办法从 Windows 中包装 findStr 并获得性能提升?

【问题讨论】:

  • 真的,每个磁盘上的每个 INI 和 XML 文件?
  • 这听起来像是一个 Powershell 脚本的工作。一个例子可以在here 找到。免责声明:我没有尝试过我链接的脚本。使用它需要您自担风险。
  • 您是否需要经常运行此脚本?这几乎听起来像是你需要运行一次然后快乐的事情。如果是这样,为什么性能会成为问题?
  • Alexn,是的,每个 INI 和 XML 文件以及更多扩展名?
  • PHeiberg,感谢您的建议。我会读的。

标签: c# .net file stream


【解决方案1】:

您的限制因素将是磁盘访问速度,而您无法加快速度。当然,使用 Lambda 表达式不会产生性能差异。

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

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

我建议您不要使用 C# 执行此操作。相反,编写两个 PowerShell 脚本。第一个搜索驱动器以查找与您的条件匹配的文件,并将这些文件名写入文件。第二个从该文件中读取文件名,并处理这些文件。示例见https://stackoverflow.com/a/60065/56778

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

【讨论】:

  • Jim Mischel,感谢您的 cmets。你知道我怎样才能发现一个文件是否可编辑?我的意思是,假设我没有以前的开发人员用来在应用程序中设置服务器名称的所有扩展。例如,出于某种原因,开发人员在名为 my_config.server 的文件中硬编码了服务器的名称,该文件基本上是一个可在记事本中编辑的文本文件,但扩展名与 .config 或 .ini 不同。 C# 中是否有一种安全的方法可以发现这是一个文本文件而不是字节码?
  • @Demetrio:唯一的方法是打开文件并检查它。如果文件仅包含 ASCII 字符和换行符或制表符,则它是可编辑的。这是最简单的情况。如果文件采用 8 位编码(例如西里尔文)、Unicode、UTF-8 或某些多字节字符集,则问题会更加复杂。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多