我们使用以下方法写出文本文件:
public void WriteFile(string filePath, string contents)
{
if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath"); }
if (contents == null) { throw new ArgumentNullException("contents"); }
if (File.Exists(filePath))
{
throw new InvalidOperationException(string.Format("The file '{0}' already exists", filePath));
}
StreamWriter sw = File.CreateText(filePath); // slow
sw.Write(contents);
sw.Close(); // slow
}
我们多次调用此函数,因此性能至关重要。评论slow
的两行是我们的应用程序花费大部分时间的地方。
参数contents
平均包含大约10 KB的文本。
.NET中是否有其他方法或使用已知具有明显更好性能的Win32 API?
我们已经尝试过以下方法:
TextWriter tw = new StreamWriter(filePath);
tw.Write(contents);
tw.Close();
但是发现表现与我们最初的方法相似。
根据建议,我们也尝试过:
File.WriteAllText(filePath, contents);
然而,这与上面列出的其他方式相似。
答案 0 :(得分:3)
听起来像backgroundworker.的工作将写入权限卸载到新线程,并且有事件通知您/用户进度和完成情况。
答案 1 :(得分:3)
编写文件最直接的方法是:
File.WriteAllText(filePath, contents);
如果您遇到性能问题,应该查看您的要求。由于操作中没有任何部分可以更有效地完成,因此您应该确定是否可以跳过或稍后执行操作的任何部分。
例如,退出方法时是否需要完全写入和关闭文件?否则,您可以将任务放入队列中,让后台线程按照自己的步调在文件之后写入文件。
答案 2 :(得分:1)
你可以创建另一个线程来在8k数据块(内部缓冲区大小)中异步写入文件。
答案 3 :(得分:1)
答案 4 :(得分:1)
... sw.Write sw.Flush(); //插入新行 sw.Close()...
如果你在上面插入新行,你可能会在数据写入磁盘时看到你的“慢”移动。
您是否正在运行可以禁用的病毒扫描软件? 你能在电池备份磁盘控制器中启用写缓存吗?
答案 5 :(得分:1)
忘了你的代码。使用HDD时的性能问题是文件系统,操作系统以及硬件质量等问题。
我唯一可以建议的是重新设计你的应用程序。例如,您可以编写大文件而不是许多小文件。只需对所有这些进行.tar归档,因为它不会压缩任何内容,而只是逐个存储文件流。