2012-12-12 61 views
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(); 

     } 
+0

您使用的是什么版本的.Net。你的目标是> = 4.0吗? – pstrjds

+0

你想要“优化代码”是什么意思?最快 - foreach可能是最好的你可以得到... shortes - 'ReadAllText' /'WriteAllText'不需要'Close',correst - 不要使用半无效的正则表达式,其他的东西? –

回答

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\")); 
    } 
}