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

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

  1. 使用StreamReader读取原始文件中的每一行。
  2. 打开StringBuilder以获取新文件的内容。
  3. 修改字符串对象并调用StringBuilder AppendLine (直到文件末尾)
  4. 打开一个新的StreamWriter ,并将StringBuilder写入写入流。

但是,我发现StremWriter.Write截断32768字节(2 ^ 16),但StringBuilder的长度大StremWriter.Write 。 我可以编写一个简单的循环来保证整个字符串到文件。 但是,我想知道在执行此任务时C#中最有效的方法是什么?

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

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

StreamWriter.Write

才不是

截断字符串并没有限制。

在内部它使用String.CopyTo ,另一方面,它使用不安全的代码 (使用fixed )来复制字符,因此它是最有效的

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

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

你能试试这个:

  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(); } 

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

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

 public List GetAllProfiles() { List profileNames = new List(); 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; } 

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

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

 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 } } } 

你试过File.WriteAllText()方法吗?