0

我可以在不使用 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();

        }
4

1 回答 1

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\"));
    }
}
于 2012-12-12T05:58:07.380 回答