即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法。

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

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

C# FileStream复制大文件的更多相关文章

  1. Filestream复制视频文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  2. java多线程实现复制大文件

    有些开发的时候我们经常遇到这样一个问题,对大文件的处理.比如:日志文件.那么十几G的大文件.我们应该如何复制呢? 还有就是希望从本地和远程复制文件,文件都很大,10G级的如何办呢? 在这里我告诉你们, ...

  3. 关于FileStream读取大文件问题

    小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法 这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和Stream ...

  4. Windows 2003 复制大文件提示系统资源不足的处理方法

    方案一: 修改虚拟内存,让虚拟内存的大小略微超过要复制的文件的大小. 方案二: 修改注册表,如下: 注册表设置1 单击开始,单击运行,在打开框中键入“REGEDIT“ ,然后单击“确定”. 找到并单击 ...

  5. ios优化复制大文件时,如何使内存运用最少且效率最高

    我也是纠结了好几天,我想自己想个办法,但是数据复制不上去,我现在还不明白,如果有人知道我错在哪了,请留言,如果还有更好的方法,请分享共同进步. ____________________________ ...

  6. Java 复制大文件方式(nio2 FileChannel 拷贝文件能力测试)

    目前为止,我们已经学习了很多 Java 拷贝文件的方式,除了 FileChannel 提供的方法外,还包括使用 Files.copy() 或使用字节数组的缓冲/非缓冲流.那个才是最好的选择呢?这个问题 ...

  7. robocopy复制大文件

    需要把win7某个盘的资料复制到移动硬盘保存,用xcopy 结果出现内存不足的错误 我的资料约50G  一查才发现要用RoboCopy.在cmd中试了一下,发现真是白用了这么多年win7,都马上要淘汰 ...

  8. FileStream大文件复制

    FileStream缓冲读取和写入可以提高性能.FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在Fi ...

  9. C# 跨服务大文件复制

    跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······ 首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参 ...

随机推荐

  1. Unity3D中的第三人称镜头的脚本控制

    原地址:http://blog.csdn.net/mobanchengshuang/article/details/27591271 好久没有敲Blog了,谢谢大家的留言.关注.私信等支持,但是我好像 ...

  2. 当 ITOA 遇上 OneAlert,企业可以至少每年节省 3600 小时!

    每个工作日,一家大型企业都可能存在一两件优先级为 1 级的事件,五六件优先级为 2 级的事件和百来件优先级为 3 级的事件.试想一下,如果公司所有支持人员都要收到每个事件的通知--不想了,我好方!还能 ...

  3. C#虚方法virtual详解

    转: http://www.cnblogs.com/jason_yjau/archive/2009/08/25/1553949.html C#虚方法virtual详解 在C++.Java等众多OOP语 ...

  4. Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因

    近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...

  5. ActionBar官方教程(9)ActionBar的顶部tab模式(注意,已经被弃用)

    This interface is deprecated.Action bar navigation modes are deprecated and not supported by inline ...

  6. Android 使用 popupWindow实现弹层并操作弹层元素

    需求: 点页面,出现弹层,弹层包含EditText,Button等,点击Button实现提交操作: 最终代码: private PopupWindow popupWindow ; private Ed ...

  7. JSOI2009 游戏

    1443: [JSOI2009]游戏Game Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 557  Solved: 251[Submit][Stat ...

  8. 转自 Good morning 的几句精辟的话

    1.志愿者招募 根据流量平衡方程来构图非常方便,而且简单易懂,以后可能成为做网络流的神法之一 简单记一下流量平衡方程构图法的步骤: a.列出需求不等式 b.通过设置松弛变量,将不等式变成等式 c.两两 ...

  9. NOI2010航空管制

    2008: [Noi2010]航空管制 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 31  Solved: 0[Submit][Status] De ...

  10. lightoj 1002

    最短路的变形,使用spfa做. #include<set> #include<map> #include<list> #include<stack> # ...