【问题标题】:writing a large stream to a file in C#.Net 64K by 64K将大流写入 C#.Net 64K x 64K 中的文件
【发布时间】:2011-05-14 12:27:49
【问题描述】:

请给我一个可以用来将流写入文件的好方法。

我只需要一个简单的 c# 函数,它可以将流作为输入并完成工作.. 我需要为非常大的文件执行此操作,即大于 4GB 的文件。

使用 linq、扩展方法等可以做得更好吗?

请给我一个很好的实用函数,它也可以通过yield返回百分比的进度。

编辑:我知道循环遍历 byte[] 并将其写入文件。我试过 File.WriteAllBytes 方法。但是,我只是在寻找一种使用 linq、yield 和扩展方法的非常好的方法。

【问题讨论】:

  • @Ladislav,我已经有代码可以从流写入文件。我的意思是我知道我们可以遍历字节并写入它,甚至可以使用 File.Write 方法。
  • @Oded,我需要一个使用现代技术编写的简洁的可重用函数
  • 我可以知道您正在创建哪种应用程序需要这么大的文件

标签: c# filestream


【解决方案1】:

编辑:这是一个实用函数,应该可以解决问题:

更新:将第二个参数更改为文件名

    public delegate void ProgressCallback(long position, long total);
    public void Copy(Stream inputStream, string outputFile, ProgressCallback progressCallback)
    {
        using (var outputStream = File.OpenWrite(outputFile))
        {
            const int bufferSize = 4096;
            while (inputStream.Position < inputStream.Length)
            {
                byte[] data = new byte[bufferSize];
                int amountRead = inputStream.Read(data, 0, bufferSize);
                outputStream.Write(data, 0, amountRead);

                if (progressCallback != null)
                    progressCallback(inputStream.Position, inputStream.Length);
            }
            outputStream.Flush();
        }
    }

【讨论】:

  • @aKzenT,谢谢..但还有一件事(对不起,我之前忘了提到这一点),似乎我需要按照 MSDN 的文档编写 64k x 64k 来编写通过 WCF 中的流传输的文件
  • 只需将缓冲区大小调整为 64k...但是您能告诉我您指的是哪个吗?有链接吗?
  • 引用它以便您可以看到“假设您的服务必须接收最大 4 GB 的文件并将它们存储在本地磁盘上。假设您的内存受到限制,您只能一次缓冲 64 KB 的数据”。来自msdn.microsoft.com/en-us/library/ms733742.aspx
  • @aKzenT,我想我误解了。它提到“假设”。再次抱歉 aKzen。所以,我想这只是一个示例场景,并不总是很重要。
  • 我把第二个参数改成了文件名
猜你喜欢
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2015-01-29
  • 2011-10-20
  • 2014-12-24
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多