C#谈文件操作NO2(大文件拷贝)

上一篇介绍了文件的一些基本操作,介绍了文件的加密操作。这一篇介绍一些文件流的操作

文件流类FileStream实现大文件拷贝

大文件拷贝之所以用文件流来进行拷贝,主要是由于如果用File静态类来执行拷贝就是将整个文件整体传输,对于一个好几个G的大文件会造成内存占用大,运行慢,效率不高。所以用到文件流拷贝。文件流拷贝可以设置拷贝的二进制流缓冲区的大小,然后根据缓冲区的大小来一点一点拷贝,就类似与U盘拷贝文件到电脑似的。

下面就介绍一下如何实现拷贝

source是源文件路径,target是目标文件路径

中间缓冲区的大小看自己所要传输的文件的大小,这里创建了一个10M的缓冲区。

//1、创建一个读取源文件的文件流
            using (FileStream fsRead=new FileStream (source ,FileMode .Open ,FileAccess .Read ))
            {
                //2、创建一个写入目标文件的文件流
                using (FileStream fsWrite=new FileStream (target ,FileMode.Create ,FileAccess .Write))
                {
                    //拷贝文件的时候,创建一个中间缓冲区
                    byte[] bytes = new byte[1024 * 1024 * 10];
                    //返回值表示本次实际读到的字节个数
                    int r = fsRead.Read(bytes, 0, bytes.Length);

                    while (r>0)
                    {
                        //将读取到的内容写入到新文件
                        //第三个参数应该是实际读取到的字节数,而不是数组的长度
                        fsWrite.Write(bytes, 0, r);
                        Console.Write(".");
                        r = fsRead.Read(bytes, 0, bytes.Length);
                        
                    }
                }
            }

Ps:

当用文件流FileStream来读取文本文档的时候,由于汉字是用2个字节编码,而字母是1个字节。对于一个固定的二进制字节流缓冲区,不能很好的区分汉字和字母,这样有可能缓冲区完毕之后最后一个汉字读到1个字节,这就是“半个汉字“这就出现了信息不完整的现象。所以这时读取文本文档就要用StreamWriter,StreamReader。



你可能感兴趣的:(.net,C#)