我可以优化替换内容的代码吗?

时间:2012-12-12 05:54:06

标签: c#

我可以在不使用foreach循环的情况下优化代码吗?目标是查找具有.config扩展名的文件,并在将其部署到生产环境之前替换指定的文本。

DirectoryInfo di= new DirectoryInfo(@"C:\Inetpub\Wwwroot\workframew\Presentation\Website");
        FileInfo[] fl= di.GetFiles("*.config");
        foreach (FileInfo fi in fl)
        {
            //File.Replace(fi.FullName,fi.FullName,.ReadAllText(fi.FullName) = File.ReadAllText(fi.FullName).Replace(@"F:\LogFiles\ApplicationLogs\Compass\",@"C:\Compass_350\Compass\");
            string filePath = fi.FullName;
            StreamReader reader = new StreamReader(filePath);
            string content = reader.ReadToEnd();
            reader.Close();

            content = Regex.Replace(content, @"F:\LogFiles\ApplicationLogs\Compass\", @"C:\Compass_350\Compass\");

            StreamWriter writer = new StreamWriter(filePath);
            writer.Write(content);
            writer.Close();

        }

1 个答案:

答案 0 :(得分:3)

从.NET 4开始,Directory.EnumerateFiles有一个重载,允许您搜索模式和可选的所有子目录。在早期版本-v2或更高版本中(或者如果您更喜欢返回字符串数组的方法),您可以使用类似工作的Directory.GetFiles。区别在于前者返回IEnumerable<string>,而后者返回一个字符串数组。

但是,您仍然需要自己转换文件,因此所有这些方法都需要构建一个递归结构,这仍然是值得的。另外,你需要转义正则表达式特殊字符,这样就可以找到你正在搜索的字符串(目录路径),除非表达是预期的(在这种情况下,显然你希望字面上找到路径,所以必须转义反斜杠。

foreach(var file in Directory.EnumerateFiles(@"C:\Inetpub\Wwwroot\workframew\Presentation\Website", "*.config", SearchOptions.AllDirectories))
{
    string content = null;

    using(var reader = new StreamReader(file))
    {
       content = reader.ReadToEnd();
    }

    using(var writer = new StreamWriter(file))
    {
        writer.write(Regex.Replace(content, @"F:\\LogFiles\\ApplicationLogs\\Compass\\", @"C:\Compass_350\Compass\"));
    }
}