在C#.Net 64K x 64K中向文件写入大流

在C#.Net 64K x 64K中向文件写入大流,c#,filestream,C#,Filestream,请建议我一个好的方法,可以用来写一个流到一个文件 我只需要一个简单的c#函数,它可以将一个流作为输入并完成这项工作。。 我需要对非常大的文件(即大于4GB的文件)执行此操作 使用linq、扩展方法等可以更好地实现这一点吗 请给我提供一个很好的实用功能,也可以通过收益率返回进度百分比 编辑:我知道如何循环遍历字节[]并将其写入文件。我尝试了File.writealBytes方法。但是,我只是在寻找一种使用linq、yield和extension方法的非常好的方法。Edit:下面是一个实用函数,它应

请建议我一个好的方法,可以用来写一个流到一个文件

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

使用linq、扩展方法等可以更好地实现这一点吗

请给我提供一个很好的实用功能,也可以通过收益率返回进度百分比


编辑:我知道如何循环遍历字节[]并将其写入文件。我尝试了File.writealBytes方法。但是,我只是在寻找一种使用linq、yield和extension方法的非常好的方法。

Edit:下面是一个实用函数,它应该可以做到这一点:

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

    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();
        }
    }
public delegate void ProgressCallback(多头头寸,多头总计);
公共无效副本(流inputStream、字符串outputFile、ProgressCallback ProgressCallback)
{
使用(var outputStream=File.OpenWrite(outputFile))
{
常量int bufferSize=4096;
while(inputStream.Position
编辑:下面是一个实用程序函数,可以实现以下功能:

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

    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();
        }
    }
public delegate void ProgressCallback(多头头寸,多头总计);
公共无效副本(流inputStream、字符串outputFile、ProgressCallback ProgressCallback)
{
使用(var outputStream=File.OpenWrite(outputFile))
{
常量int bufferSize=4096;
while(inputStream.Position
@Ladislav,我已经有了从流到文件的代码。我的意思是,我知道我们可以循环遍历字节并写入,甚至可以使用File.write方法。@Oded,我需要一个使用现代技术编写的整洁的可重用函数。我知道您正在创建的应用程序类型需要如此大的容量file@Ladislav,我已经有了从流写入文件的代码。我的意思是,我知道我们可以循环遍历字节并写入,甚至可以使用File.write方法。@Oded,我需要一个使用现代技术编写的整洁的可重用函数。我知道您正在创建的应用程序类型需要如此大的容量file@aKzenT,谢谢..但还有一件事(对不起,我以前忘了提这件事),它似乎我需要写64k的64k根据MSDN的文件写入通过WCF流传输的文件调整缓冲区大小为64k。。。但是你能告诉我你指的是哪一个吗?你有链接吗?引用它,这样你就可以看到“假设你的服务必须接收大小不超过4 GB的文件,并将它们存储在本地磁盘上。同时假设你的内存受到限制,一次只能缓冲64 KB的数据”。来自@aKzenT,我想我误解了。它提到“假设”。再次抱歉,阿肯。所以,我想这只是一个示例场景,并不总是重要的instead@aKzenT,谢谢..但还有一件事(对不起,我以前忘了提这件事),它似乎我需要写64k的64k根据MSDN的文件写入通过WCF流传输的文件调整缓冲区大小为64k。。。但是你能告诉我你指的是哪一个吗?你有链接吗?引用它,这样你就可以看到“假设你的服务必须接收大小不超过4 GB的文件,并将它们存储在本地磁盘上。同时假设你的内存受到限制,一次只能缓冲64 KB的数据”。来自@aKzenT,我想我误解了。它提到“假设”。再次抱歉,阿肯。所以,我想这只是一个示例场景,并不总是重要的。我将第二个参数改为使用文件名