在C#中,我正在读取中等大小的文件(100 KB~1 MB),修改内容的某些部分,最后写入不同的文件。所有内容都是文字。修改以字符串对象和字符串操作完成。我目前的做法是:
StreamReader
。StringBuilder
以获取新文件的内容。AppendLine
的{{1}}(直到文件末尾)StringBuilder
,并将StreamWriter
写入写入流。但是,我发现StringBuilder
截断32768字节(2 ^ 16),但StremWriter.Write
的长度大于StringBuilder
。我可以写一个简单的循环来保证整个字符串到一个文件。但是,我想知道在执行此任务时C#中最有效的方法是什么?
总而言之,我只想修改文本文件的某些部分并写入不同的文件。但是,文本文件大小可能大于32768字节。
==答案==很抱歉让你烦恼!只是我没有打电话给flush
。 StremWriter.Write
没有短期(例如,2 ^ 16)限制。
答案 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()
方法?