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