C# 使用C语言复制文件

C# 使用C语言复制文件,c#,filestream,C#,Filestream,可能重复: 我知道我可以使用File.Copy,但我更感兴趣的是用更长的时间来做,只是为了教育目的 现在,我想讨论的方法是使用StreamReader和StreamWriter或FileStreams 在我看来,我会将文件作为二进制文件读入内存,然后将文件写入新位置。这给我的印象是,自 1整个文件正在加载到内存中,我不知道文件有多大 2与复制一个字节、粘贴一个字节之类的东西相比,这将是非常耗时的,我认为这就是流媒体的工作方式,因为我们必须等待整个文件存储在内存中,然后才能开始粘贴 所以,要问我

可能重复:

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

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

在我看来,我会将文件作为二进制文件读入内存,然后将文件写入新位置。这给我的印象是,自 1整个文件正在加载到内存中,我不知道文件有多大 2与复制一个字节、粘贴一个字节之类的东西相比,这将是非常耗时的,我认为这就是流媒体的工作方式,因为我们必须等待整个文件存储在内存中,然后才能开始粘贴

所以,要问我,我该如何流式处理复制粘贴作业呢

所以,要问我,我该如何流式处理复制粘贴作业呢

与其将每个字节分别读入内存,或者将整个文件读入内存,不如在这两者之间做一半——创建一个缓冲区,例如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可以解决这一问题,但会使它变得更加复杂——而且操作系统完全有可能足够智能,可以在您编写时继续阅读

请注意,除非您确实在阅读文本,否则您肯定希望使用流而不是TextReader/TextWriter

创建一个空的目标文件 从源文件读取缓冲区,比如说1024字节 将缓冲区写入目标文件 重复2,直到完成所有操作
例如,您可以以1 MB的块读取/写入文件。这说明了如何做到这一点。

这很简单:读一个块,写一个块直到EOF。但你们试过什么?@raman我试过几件事,最后陷入了一个循环——然后我开始在网上寻找答案,每一个其他答案都表明了一条不同的路线。不同路线的问题是,我不知道路线是否好,因此最好在这个网站上询问其他人对这些路线的评论suggestions@CodeCaster-事实上,在我正在做的一个项目中,我们有类似的东西,但我再次遇到的问题是不知道它是否好,主要是因为在工作中,我被困在.NET 2.0上-这使我的学习变得困难,因为我被旧技术包围着-我不想在OP中提到逐块阅读/写作,因为它“引导答案”太多-相反,看看答案,大多数人同意你的观点,但我也有一个异步。选项并学习了很多关于File.CopyPerfect的知识,这正是我希望的答案类型,你的书今天从亚马逊上发来:这正是我希望的答案类型-然后在下一个问题中加入你的想法。我们猜不出你一直在想什么-@DaveRook:请参见示例代码的编辑-讽刺的是,它与您在书中的某个地方找到的代码几乎相同: