【发布时间】:2008-09-24 17:51:47
【问题描述】:
相当简单的场景。我有一个 Web 服务,它接收一个字节数组,该数组将被保存为磁盘上的特定文件类型。在 C# 中执行此操作的最有效方法是什么?
【问题讨论】:
相当简单的场景。我有一个 Web 服务,它接收一个字节数组,该数组将被保存为磁盘上的特定文件类型。在 C# 中执行此操作的最有效方法是什么?
【问题讨论】:
【讨论】:
System.IO.File.WriteAllBytes(path, data) 应该没问题。
【讨论】:
WriteAllBytes 只是执行
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
{
stream.Write(bytes, 0, bytes.Length);
}
BinaryWriter 有一个误导性的名称,它旨在将原语编写为字节表示形式,而不是写入二进制数据。它的所有 Write(byte[]) 方法所做的就是在其使用的流上执行 Write(),在本例中为 FileStream。
【讨论】:
不确定在这种情况下您所说的“高效”是什么意思,但我会使用 System.IO.File.WriteAllBytes(string path, byte[] bytes) - 就 LOC 而言肯定是高效的。
【讨论】:
我在将 300 MB 字节数组转储到磁盘文件时遇到了类似问题...
我使用 StreamWriter,我花了 30 分钟才转储文件。
使用 FilePut 花了我大约 3-4 分钟,而当我使用 BinaryWriter 时,文件在 50-60 秒内被转储。
如果你使用 BinaryWriter 你会有更好的表现。
【讨论】:
也许 System.IO.BinaryWriter 和 BinaryReader 类会有所帮助。
http://msdn.microsoft.com/en-us/library/system.io.binarywriter.aspx
“以二进制形式将原始类型写入流,并支持以特定编码写入字符串。”
http://msdn.microsoft.com/en-us/library/system.io.binaryreader.aspx
“将原始数据类型读取为特定编码中的二进制值。”
【讨论】:
实际上,最有效的方法是流式传输数据并在收到数据时写入。 WCF 支持流式传输,因此这可能是您想要研究的内容。如果您对大文件执行此操作,这一点尤其重要,因为您几乎肯定不希望服务器和客户端内存中的文件内容。
【讨论】: