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 に答える