将大字符串写入文件的最佳方法

时间:2011-02-17 09:54:18

标签: c# string file stream

在C#中,我正在读取中等大小的文件(100 KB~1 MB),修改内容的某些部分,最后写入不同的文件。所有内容都是文字。修改以字符串对象和字符串操作完成。我目前的做法是:

  1. 使用StreamReader
  2. 读取原始文件中的每一行
  3. 打开StringBuilder以获取新文件的内容。
  4. 修改字符串对象并调用AppendLine的{​​{1}}(直到文件末尾)
  5. 打开一个新的StringBuilder,并将StreamWriter写入写入流。
  6. 但是,我发现StringBuilder截断32768字节(2 ^ 16),但StremWriter.Write的长度大于StringBuilder。我可以写一个简单的循环来保证整个字符串到一个文件。但是,我想知道在执行此任务时C#中最有效的方法是什么?

    总而言之,我只想修改文本文件的某些部分并写入不同的文件。但是,文本文件大小可能大于32768字节。

    ==答案==很抱歉让你烦恼!只是我没有打电话给flushStremWriter.Write没有短期(例如,2 ^ 16)限制。

7 个答案:

答案 0 :(得分:11)

StreamWriter.Write

截断字符串并没有限制。

在内部,它使用String.CopyTo,另一方面使用不安全代码(使用fixed)来复制字符,以便效率最高

答案 1 :(得分:4)

问题很可能与不关闭作者有关。见http://msdn.microsoft.com/en-us/library/system.io.streamwriter.flush.aspx

但如果可以避免,我建议不要将整个文件加载到内存中。

答案 2 :(得分:1)

你可以试试这个:

    void Test()
    {
        using (var inputFile = File.OpenText(@"c:\in.txt"))
        {
            using (var outputFile = File.CreateText(@"c:\out.txt"))
            {
                string current;
                while ((current = inputFile.ReadLine()) != null)
                {
                    outputFile.WriteLine(Process(current));
                }
            }
        }
    }

    string Process(string current)
    {
        return current.ToLower();
    }

避免在内存中加载完整文件,逐行处理并直接写入

答案 3 :(得分:0)

而不是通过孔dokument我会使用正则表达式找到你要找的样品:

public List<string> GetAllProfiles()
    {
        List<string> profileNames = new List<string>();
        using (StreamReader reader = new StreamReader(_folderLocation + "profiles.pg"))
        {
            string profiles = reader.ReadToEnd();
            var regex = new Regex("\nname=([^\r]{0,})", RegexOptions.IgnoreCase);
            var regexMatchs = regex.Matches(profiles);
            profileNames.AddRange(from Match regexMatch in regexMatchs select regexMatch.Groups[1].Value);
        }
        return profileNames;
    }

答案 4 :(得分:0)

我发现这个answer在类似情况下非常有用。没有任何源代码,它更像是提示。我希望它有所帮助。

答案 5 :(得分:0)

那么,这完全取决于你想要修改的内容。如果您对文本文件的一部分的修改依赖于文本文件的另一部分,则显然需要在内存中同时包含这两部分。但是,如果您只需要逐行修改文本文件,那么请使用以下内容:

using (StreamReader sr = new StreamReader(@"test.txt"))
{
    using (StreamWriter sw = new StreamWriter(@"modifiedtest.txt"))
    {
        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            //do some modifications
            sw.WriteLine(line);
            sw.Flush(); //force line to be written to disk
        }
    }
}

答案 6 :(得分:-1)

您是否尝试过File.WriteAllText()方法?