使用C#复制文件

时间:2012-10-10 13:37:42

标签: c# filestream

  

可能重复:
  Best way to copy between two Stream instances - C#

我知道我可以使用File.Copy但是,我更感兴趣的是更长时间,只是出于教育目的。

现在,我想讨论的方法是使用StreamReader和StreamWriter(或FileStreams)。

在我看来,我会将文件(作为二进制文件)读入内存,然后将文件写入新位置。这使我感到因为可能会出现错误 1)整个文件被加载到内存中(我不知道文件有多大)和
2)与复制字节,粘贴字节(我假设流式传输的工作方式)相比,这将是耗时的,因为我们必须等待整个文件在粘贴甚至开始之前存储在内存中。

所以,还有很长的路要走,我将如何流式传输复制和粘贴作业?

3 个答案:

答案 0 :(得分:4)

  

所以,还有很长的路要走,我将如何流式传输复制和粘贴作业?

不是将每个字节分别读入内存,也不是将整个文件读入内存,而是介于两者之间 - 创建一个缓冲区,例如: 32K,并要求输入流读取那么多数据。写出你读过的很多字节,然后重复,直到没有更多的数据要读。如下所示:

public void Copy(Stream input, Stream output)
{
    byte[] buffer = new byte[32 * 1024];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

这不像可能那样有效,因为你不是在同时阅读和写作。异步IO可以解决这个问题,但是让它更多更复杂 - 而且完全有可能操作系统足够聪明,无论如何都要继续阅读......

请注意,除非您实际阅读的是文字,否则您肯定希望使用Stream而不是TextReader / TextWriter

答案 1 :(得分:2)

您可以以1 MB的块(例如)读/写文件。 MSDN has an example显示了如何做到这一点。

答案 2 :(得分:1)

  1. 创建空目标文件
  2. 从源文件中读取一个缓冲区(比方说1024字节)
  3. 将缓冲区写入destionation文件
  4. 重复2,直到一切都完成