我可以在不使用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 :(得分: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\"));
}
}