【问题标题】:What is the most efficient way to save a byte array as a file on disk in C#?在 C# 中将字节数组保存为磁盘上的文件的最有效方法是什么?
【发布时间】:2008-09-24 17:51:47
【问题描述】:

相当简单的场景。我有一个 Web 服务,它接收一个字节数组,该数组将被保存为磁盘上的特定文件类型。在 C# 中执行此操作的最有效方法是什么?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    那就是File.WriteAllBytes()

    【讨论】:

    • 正如@chris-s 提到的,File.WriteAllBytes 内部使用 FileStream.Write(Bytes[], int,int)
    【解决方案2】:

    System.IO.File.WriteAllBytes(path, data) 应该没问题。

    【讨论】:

      【解决方案3】:

      WriteAllBytes 只是执行

      using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
      {
          stream.Write(bytes, 0, bytes.Length);
      }
      

      BinaryWriter 有一个误导性的名称,它旨在将原语编写为字节表示形式,而不是写入二进制数据。它的所有 Write(byte[]) 方法所做的就是在其使用的流上执行 Write(),在本例中为 FileStream。

      【讨论】:

        【解决方案4】:

        不确定在这种情况下您所说的“高效”是什么意思,但我会使用 System.IO.File.WriteAllBytes(string path, byte[] bytes) - 就 LOC 而言肯定是高效的。

        【讨论】:

          【解决方案5】:

          我在将 300 MB 字节数组转储到磁盘文件时遇到了类似问题...
          我使用 StreamWriter,我花了 30 分钟才转储文件。
          使用 FilePut 花了我大约 3-4 分钟,而当我使用 BinaryWriter 时,文件在 50-60 秒内被转储。
          如果你使用 BinaryWriter 你会有更好的表现。

          【讨论】:

            【解决方案6】:

            也许 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

            “将原始数据类型读取为特定编码中的二进制值。”

            【讨论】:

              【解决方案7】:

              实际上,最有效的方法是流式传输数据并在收到数据时写入。 WCF 支持流式传输,因此这可能是您想要研究的内容。如果您对大文件执行此操作,这一点尤其重要,因为您几乎肯定不希望服务器和客户端内存中的文件内容。

              【讨论】:

              • 这是一个没有人谈论的重要细节,但正如您指出的那样,WriteAllBytes 并不是最有效的内存方式,因为它会消耗大量内存。在可能的情况下即时编写肯定会更好,我什至只需使用带有较小缓冲区的 StreamWriter 就可以更好地分配。
              猜你喜欢
              • 1970-01-01
              • 2015-05-29
              • 1970-01-01
              • 2014-09-02
              • 2013-12-16
              • 2014-01-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多