即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.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. [codility]Grocery-store

    http://codility.com/demo/take-sample-test/hydrogenium2013 用Dijkstra求最短路径,同时和D[i]比较判断是不是能到.用了优先队列优化,复 ...

  2. Android 动态刷新listview中的数据

    之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶. 下面做了一 ...

  3. RPGJS 进阶分析之 如何使用RMXP导出的数据

    首先启动RMXP 在主脚本编辑区粘贴官方提供的导出数据脚本. 之后启动并进入游戏之后按F8键就可以调出导出Map和Animation的菜单 导出后的数据保存在工程目录下的RpgJs目录下. Datab ...

  4. java web路径的问题

    对于<form action="/xx"> 和 <a href='/xx'> 其中,xx相应的为网站根目录 一般网站为虚拟目录,所以要 写成   /web应 ...

  5. 【HDOJ】1285 确定比赛名次

    拓扑排序,居然要考虑重边,使用STL实现. #include <iostream> #include <cstdio> #include <cstring> #in ...

  6. tlplayer for ios V1.1(附上截图)

    此程序UI修改于虎跃在线课堂.所以极其相似. 可以播放网络视频与本地视频,不知道怎么拷贝本地视频到Ipad或iphone上看的朋友,请自己到网上看教程. 支持mms,file,rtsp,rtmp,ht ...

  7. 结构体page_cur_t

    /** Type of the index page */ typedef byte page_t; /** Index page cursor */ typedef struct page_cur_ ...

  8. apache开源项目--gora

    Gora 是一个应用于 NoSQL 数据库的 ORM 框架,支持包括:Apache HBase/Apache Cassandra

  9. 微信公共服务平台开发(.Net 的实现)2-------获得ACCESSTOKEN

    成为了开发者之后微信平台会给您appid和secret,在订阅号中是没有的,所以因该申请一下服务号 有了ACCESSTOKEN才能做添加菜单,上传/下载图片等功能 private string Get ...

  10. Android 线程优先级

    对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编程 ...