2011-05-14 43 views
0

请给我一个可用于将流写入文件的好方法。通过64K将大流写入C#.Net 64K中的文件

我只需要一个简单的c#函数,可以将流作为输入并执行作业。 我需要为超大文件(即大于4GB的文件)执行此操作。

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

请为我提供一个很好的实用功能,它还可以通过良率返回百分比进度。

编辑:我知道关于循环一个字节[]并将其写入文件。我试过File.WriteAllBytes方法。但是,我只是在寻找一种使用linq,yield和extension方法的非常好的方法。

+0

@Ladislav,我已经有代码从流写入到一个文件。我的意思是我知道我们可以循环访问这些字节并编写它,甚至可以使用File.Write方法。 – Josh 2011-05-14 12:31:18

+0

@Oded,我需要一个使用现代技术编写的整洁的可重用函数 – Josh 2011-05-14 12:39:26

+0

我可以知道你正在创建哪种类型的应用程序,您需要这样的大文件 – Vir 2011-05-14 12:45:10

回答

3

编辑:这里是一个效用函数应该做的伎俩:

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

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(); 
     } 
    } 
+0

@aKzenT,谢谢..但只是一件事(对不起,我忘了提及这似乎是我需要按照MSDN的文档写入64k 64k,以便通过WCF中的流传输文件来传输文件 – Josh 2011-05-14 12:46:47

+2

只需将缓冲区大小调整为64k ...但是您能否告诉我您准确指向了哪一个?你有链接吗? – aKzenT 2011-05-14 12:52:06

+0

引用它可以看到“假设你的服务必须接收大小高达4GB的文件并将它们存储在本地磁盘上。假设你的内存受到限制,只能在一个缓冲区中缓冲64KB的数据时间”。它来自http://msdn.microsoft.com/en-us/library/ms733742.aspx – Josh 2011-05-14 12:57:21

相关问题