C# 将巨大字符串写入文件的最佳方法
在C语言中,我读取一个大小适中的文件100KB~1MB,修改部分内容,最后写入另一个文件。所有内容均为文本。修改是作为字符串对象和字符串操作完成的。我目前的做法是: 使用StreamReader从原始文件中读取每一行。 为新文件的内容打开StringBuilder。 修改字符串对象并调用StringBuilder的AppendLine,直到文件结束 打开新的StreamWriter,并将StringBuilder写入写入流。 但是,我发现StremWriter.Write会截断32768字节2^16,但StringBuilder的长度大于此值。我可以编写一个简单的循环来保证将整个字符串保存到一个文件中。但是,我想知道在C语言中,完成这项任务最有效的方法是什么 总而言之,我只想修改文本文件的某些部分,然后写入另一个文件。但是,文本文件大小可能大于32768字节 我很抱歉让你困惑!只是我没有打电话给同花顺。StremWriter.Write没有短字符,例如2^16限制。您能试试这个吗:C# 将巨大字符串写入文件的最佳方法,c#,string,file,stream,C#,String,File,Stream,在C语言中,我读取一个大小适中的文件100KB~1MB,修改部分内容,最后写入另一个文件。所有内容均为文本。修改是作为字符串对象和字符串操作完成的。我目前的做法是: 使用StreamReader从原始文件中读取每一行。 为新文件的内容打开StringBuilder。 修改字符串对象并调用StringBuilder的AppendLine,直到文件结束 打开新的StreamWriter,并将StringBuilder写入写入流。 但是,我发现StremWriter.Write会截断32768字节2^
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();
}
它避免了在内存中加载完整的文件,通过逐行处理并直接写入,而不是通过hole 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;
}
这完全取决于你想修改什么。如果您对文本文件一部分的修改依赖于文本文件的另一部分,那么显然需要将这两部分都存储在内存中。但是,如果您只需要逐行修改文本文件,则可以使用以下方法:
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
}
}
}
流作者,写吧
不
截断字符串并且没有限制
在内部,它使用String.CopyTo,而另一方面,它使用不安全的代码,使用fixed to copy chars,因此它是最有效的。问题很可能与未关闭写入程序有关。看
但是,如果可以避免的话,我建议不要将整个文件加载到内存中。我认为使用字符串生成器是更好的方法,您是刷新还是关闭StreamWriter?关闭writer时会自动调用flush,这是您真正应该做的。要关闭写入程序,应调用Dispose而不是close,以便释放非托管资源。最好的方法是使用using语句。所以。。。修复程序是否仍在调用Flush,还是其他方法起作用?有一个片段吗?我在HttpModule中遇到了相同的问题。没关系。。。我刚试过。成功了!