创建和编写多个10 KB文本文件的最有效方法?

时间:2009-11-18 13:26:30

标签: .net performance file winapi file-io

我们使用以下方法写出文本文件:

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

然而,这与上面列出的其他方式相似。

6 个答案:

答案 0 :(得分:3)

听起来像backgroundworker.的工作将写入权限卸载到新线程,并且有事件通知您/用户进度和完成情况。

答案 1 :(得分:3)

编写文件最直接的方法是:

File.WriteAllText(filePath, contents);

如果您遇到性能问题,应该查看您的要求。由于操作中没有任何部分可以更有效地完成,因此您应该确定是否可以跳过或稍后执行操作的任何部分。

例如,退出方法时是否需要完全写入和关闭文件?否则,您可以将任务放入队列中,让后台线程按照自己的步调在文件之后写入文件。

答案 2 :(得分:1)

你可以创建另一个线程来在8k数据块(内部缓冲区大小)中异步写入文件。

答案 3 :(得分:1)

File.WriteAllText怎么办?

答案 4 :(得分:1)

... sw.Write sw.Flush(); //插入新行 sw.Close()...

如果你在上面插入新行,你可能会在数据写入磁盘时看到你的“慢”移动。

您是否正在运行可以禁用的病毒扫描软件? 你能在电池备份磁盘控制器中启用写缓存吗?

答案 5 :(得分:1)

忘了你的代码。使用HDD时的性能问题是文件系统,操作系统以及硬件质量等问题。

我唯一可以建议的是重新设计你的应用程序。例如,您可以编写大文件而不是许多小文件。只需对所有这些进行.tar归档,因为它不会压缩任何内容,而只是逐个存储文件流。