1

我想修改以下代码以处理大文件。

    public static void Replace(string filePath, string searchText, string replaceText)
    {
        StreamReader reader = new StreamReader(filePath);
        string content = reader.ReadToEnd();
        reader.Close();

        content = Regex.Replace(content, searchText, replaceText);

        StreamWriter writer = new StreamWriter(filePath);
        writer.Write(content);
        writer.Close();
    }

我在想我需要打开一个文件流来写入一个新的文件名,然后删除原始文件并在完成后用新文件替换它。那个听起来是对的吗?

另外......我喜欢这个例程的简单性,除了必要的文件 i/o 代码行之外,只有一行代码来处理文件。但是,我也想知道我是否为了简单而牺牲性能...... Regex.Replace 是否非常高效?

4

3 回答 3

1

首先:您可以尝试Regex with Stream(似乎更快,内存需求更少):

或见Mono-Project Regex。它具有带流式传输的正则表达式。

请参阅这篇文章了解正则表达式的性能:

或者如果Regex不需要使用,请使用String.Replace并尝试这一行代码:

File.WriteAllText(filePath, 
                  File.ReadAllText(filePath).Replace(searchText, replaceText));
于 2012-07-26T05:33:19.617 回答
1

加快 Regex 的一种方法是传递 RegexOptions.Compiled 选项,该选项将使用您的 regex 并将状态机编译为 IL。这对编译步骤有一些开销,但是一旦编译,正则表达式将执行得更快。显然,您应该对代码进行计时,以查看 Regex 编译是否有助于或损害您的方案。

于 2012-07-26T05:37:46.620 回答
0

您也可以使用File类在没有正则表达式的情况下做到这一点

public static void Replace(string filePath, string searchText, string replaceText)
{
   string newText = File.ReadAllText(filePath).Replace(searchText, replaceText));
   File.Delete(filePath);
   File.WriteAllText(newFilePath, newText);
}
于 2012-07-26T06:07:49.263 回答