FileStream大文件复制

 FileStream缓冲读取和写入可以提高性能。FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件。如果文件非常大,势必消耗性能。特封装在FileHelper中以备不时之需。参考文章:http://www.cnblogs.com/yangxiaohu1/archive/2008/06/20/1226949.html将该文章中提供的代码少做修改,原文中进行了强制类型转换,如果文件很大,比如4G,就会出现溢出的情况,复制的结果字节丢失严重,导致复制文件和源文件大小不一样。这里修改的代码如下:

 1  public static class FileHelper
 2     {
 3         /// <summary>
 4         /// 复制大文件
 5         /// </summary>
 6         /// <param name="fromPath">源文件的路径</param>
 7         /// <param name="toPath">文件保存的路径</param>
 8         /// <param name="eachReadLength">每次读取的长度</param>
 9         /// <returns>是否复制成功</returns>
10         public static bool CopyFile(string fromPath, string toPath, int eachReadLength)
11         {
12             //将源文件 读取成文件流
13             FileStream fromFile = new FileStream(fromPath, FileMode.Open, FileAccess.Read);
14             //已追加的方式 写入文件流
15             FileStream toFile = new FileStream(toPath, FileMode.Append, FileAccess.Write);
16             //实际读取的文件长度
17             int toCopyLength = 0;
18             //如果每次读取的长度小于 源文件的长度 分段读取
19             if (eachReadLength < fromFile.Length)
20             {
21                 byte[] buffer = new byte[eachReadLength];
22                 long copied = 0;
23                 while (copied <= fromFile.Length - eachReadLength)
24                 {
25                     toCopyLength = fromFile.Read(buffer, 0, eachReadLength);
26                     fromFile.Flush();
27                     toFile.Write(buffer, 0, eachReadLength);
28                     toFile.Flush();
29                     //流的当前位置
30                 toFile.Position = fromFile.Position;
31                     copied += toCopyLength;
32
33                 }
34                 int left = (int)(fromFile.Length - copied);
35                 toCopyLength = fromFile.Read(buffer, 0, left);
36                 fromFile.Flush();
37                 toFile.Write(buffer, 0, left);
38                 toFile.Flush();
39
40             }
41             else
42             {
43                 //如果每次拷贝的文件长度大于源文件的长度 则将实际文件长度直接拷贝
44              byte[] buffer = new byte[fromFile.Length];
45                 fromFile.Read(buffer, 0, buffer.Length);
46                 fromFile.Flush();
47                 toFile.Write(buffer, 0, buffer.Length);
48                 toFile.Flush();
49
50             }
51             fromFile.Close();
52             toFile.Close();
53             return true;
54         }
55     }

测试代码:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5
 6             Stopwatch watch = new Stopwatch();
 7             watch.Start();
 8             if (FileHelper.CopyFile(@"D:\安装文件\新建文件夹\SQLSVRENT_2008R2_CHS.iso", @"F:\SQLSVRENT_2008R2_CHS.iso", 1024 * 1024 * 5))
 9             {
10                 watch.Stop();
11                 Console.WriteLine("拷贝完成,耗时:" + watch.Elapsed.Seconds+"秒");
12
13             }
14             Console.Read();
15         }
16
17     }

结果:

MD5校验结果:

文件: D:\安装文件\新建文件夹\SQLSVRENT_2008R2_CHS.iso
大小: 4662884352 字节
修改时间: 2010年9月3日, 10:41:26
MD5: D2BC1D35D987CC6CB8401BFB0A1E1BC9
SHA1: 0EEFF017B21635DF33F33C47E31E911CB23390F7
CRC32: 55AC3C56

文件: F:\SQLSVRENT_2008R2_CHS.iso
大小: 4662884352 字节
修改时间: 2013年9月29日, 10:51:39
MD5: D2BC1D35D987CC6CB8401BFB0A1E1BC9
SHA1: 0EEFF017B21635DF33F33C47E31E911CB23390F7
CRC32: 55AC3C56

 

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。

转载:http://www.cnblogs.com/wolf-sun/p/3345392.html

时间: 2025-01-21 19:38:16

FileStream大文件复制的相关文章

文件复制软件评测:FastCopy、TeraCopy、ExtremeCopy、Supercopier

 文件复制软件评测:FastCopy.TeraCopy.ExtremeCopy.Supercopier 引言 前段时间LYcHEE一直在忙软件代理的事情,越发意识到自己许久未投身于纯粹的软件评测中了.正好这几天需要迁移备份笔记本上的数据至移动硬盘,发现文件复制软件仍是人们日常生活中最常用的软件之一,续而感叹Windows自带复制工具先天不足,比如:不支持断点续传:传输速度较慢:替换/重命名操作设计不合理.幸好,第三方替代品百花齐放.笔者在网路上一查相关的对比评测,文章不是年代久远就是略有偏激

u盘拷贝文件过大怎么解决 大文件无法复制到U盘怎么办?

u盘拷贝文件过大怎么解决  大文件无法复制到U盘怎么办   大文件无法复制到U盘怎么办?u盘拷贝文件过大解决办法 先来说说U盘无法复制大文件的原因: 一般来说,导致U盘无法拷贝大文件,一般是4GB以上的大文件,容易遇到"复制文件过大无法复制"的情况,而导致这种情况主要是U盘文件系统格式的问题. 一般U盘默认为FAT文件系统,它无法支持超过4GB以上的单个文件,而NTFS文件系统的限制最高可达2TB. 大文件无法复制到U盘的解决办法 找到原因后,解决起来就比较简单了,只有解除U盘复制文件

Win7用U盘复制文件提示“复制文件过大无法复制”如何解决

  Win7用U盘复制文件提示"复制文件过大无法复制"如何解决          操作步骤: 1.将U盘插入电脑的USB接口中; 2.按Win+R键,打开运行,输入CMD,点击确定; 3.在打开的命令提示符窗口中,输入CONVERT X: /FS:NTFS(x代表是u盘的盘符),回车即可. 4.设置完成后,可以看到U盘的文件系统格式已经转换为NTFS,在这种格式下就可以复制过大文件了. 以上便是关于Win7用U盘复制文件提示"复制文件过大无法复制"的解决方法,大部分

U盘复制文件系统提示文件过大无法复制怎么办

  U盘复制文件系统提示文件过大无法复制怎么办         方法/步骤 在我的电脑中右击U盘,打开U盘属性,看自己U盘的文件系统是FAT32还是NTFS 如果是FAT32的话,不能复制超过4G的文件,问题就出在这里了.将U盘里面的文件备份到电脑上(因为一会需要格式化). 备份好U盘里面的文件后,右击U盘盘符,选择格式化,打开格式化对话框. 在格式化窗口中的文件系统菜单里面选择NTFS格式,然后点击[开始],对U盘进行格式化. 格式化后的U盘文件系统格式就是NTFS了,在这种格式下可以复制进去

U盘无法复制过大文件如何解决

  1.将U盘插入电脑的USB接口中; 2.按Win+R键,打开运行,输入CMD,点击确定; 3.在打开的命令提示符窗口中,输入CONVERT X: /FS:NTFS(x代表是u盘的盘符),回车即可. 设置完成后,可以看到U盘的文件系统格式已经转换为NTFS,在这种格式下就可以复制过大文件了.

Win7下局域网大文件或多文件经常出现复制中断的解决方法

  你们在传送文件都是选择哪个方式?QQ互传.U盘拷贝还是其他什么方式,这两种方式虽然最为常见,但是也有弊端,利用QQ互传的话,第一传送的速度无法保证,一般较慢;第二就是两个电脑必须都登入QQ才能实现互传,但是如果只有一个账号就难以实现了.U盘传送相对较为繁琐,要拷贝复制.现在我们可以采用局域网传送,同时避免了上诉的两个问题.万一在传送大文件时出现中断肿么办呢?下面小编来为大家解答! 出现复制大文件时才出现中断的情况,大多是由于网络不稳定引起的,当然原因有多方面. 1.目标计算机网卡不稳定或网线

Win8用工具FastCopy极速复制大文件实现快速转移

大家空闲时总会看高清电影,使用Win8系统更先进的功能来看,能有更好的体验,比如高速.流畅.但是如果要把电影这种大体积的文件转移,那就麻烦了,很花时间.其实,在Win8中,可以使用小工具"FastCopy"快速转移.如何操作呢? FastCopy,很形象的一个名字,让人望名知义,就是快速拷贝,它的主要特点如下: 1.完全支持拖曳操作,支持拖曳多个文件到来源中; 2.支持外壳整合,方便利用右键菜单直接复制文件; 3.支持三种不同的 HDD 模式; 4.内建多种人性化的操作模式; 5.支持

怎样让Win7系统复制大文件更加稳定可靠

Win7在复制大文件的过程中,相信很多朋友都有遇到系统突然崩溃的问题,这种情况出现时总会让很多人惊出一身冷汗,特别是程序显示"未响应"时,那真是一点补救的方法都没有,因此为了防止这种情况的发生,我们应当事先做一些工作,就可以巧妙避免系统崩溃了. 1.复制文件前,先关闭文件缩略图. 在Win7系统下,随便打开一个文件夹,在文件夹左上角"组织"按钮中找到"文件夹和搜索选项",然后点击进入窗口.再切换到"查看"选项卡中,在高级设置处

如何避免在Win7系统下复制大文件出现崩溃现象

有的用户在win7电脑系统复制大文件的时候,遇到系统崩溃的情况,具体表现为电脑死机或者直接卡住,无法进行操作.让用户很担心传输文件的安全,特别是一些重要的文件资料,那么有什么办法可以解决这种系统崩溃的问题呢? 1.首先大家必须做的就是当我们传输复制文件的时候做一些工作尽量减少系统崩盘的可能,大家先关闭文件的缩略图功能,紧接着我们打开系统文件夹然后就可以看到左上角有一个"组织"-"文件夹和搜索选项"-"查看"-"始终显示图标,从不显示缩略