0

可能重复:
在两个 Stream 实例之间复制的最佳方式 - C#

我知道我可以使用 File.Copy 但是,我更感兴趣的是做更长的路,只是为了教育目的。

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

在我看来,我会将文件(作为二进制文件)读入内存,然后将文件写入新位置。这让我觉得有潜在的错误,因为
1)整个文件正在加载到内存中(我不知道文件有多大)和
2)与复制一个字节,粘贴一个字节之类的东西相比,它会很耗时(我认为这是流式传输的工作方式),因为我们必须等待整个文件存储在内存中,然后才能开始粘贴。

那么,很长的路要问,我将如何流式传输复制和粘贴作业?

4

3 回答 3

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

于 2012-10-10T13:42:23.217 回答
2

您可以以 1 MB 的块为单位读取/写入文件(例如)。MSDN 有一个例子展示了如何做到这一点。

于 2012-10-10T13:43:24.613 回答
1
  1. 创建一个空的目标文件
  2. 从源文件中读取一个缓冲区(比如说 1024 字节)
  3. 将缓冲区写入目标文件
  4. 重复 2 直到一切都完成
于 2012-10-10T13:42:36.310 回答