即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.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. 安装完QQ必须要删除掉的几个恐怖文件

    安装完QQ必须要删除掉的几个恐怖文件 感谢 QQ很可怕 的投递 很多关注自己电脑硬件温度的朋友,一般都懂得去查看什么进程占用CPU较高,可能发现过有这么几个进程的CPU占用会有时莫名其妙的非常之高,它 ...

  2. activity的测试工程activiti-explorer使用

    1. activiti-explorer默认使用h2数据库,第一步要修改db.properties的配置,如果使用其他数据库的话,务必放入驱动包,oracle的ojdbc4不能用,会报错,要使用版本高 ...

  3. [jobdu]孩子们的游戏(圆圈中最后剩下的数)

    这道题就是典型的约瑟夫环问题.http://blog.csdn.net/wuzhekai1985/article/details/6628491 一开始想了一下用数组来做,就是模拟方法,同时记录一下是 ...

  4. Qt中如何写一个model(自定义一个RowNode,我没有碰到过)

    在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...

  5. java代码转换为c# 工具

    Demo Java to C# Converter.exe 已下载到 F:\SoftWare-new\java\Java_to_CSharp_Converter.rar

  6. ActionBar官方教程(11)自定义ActionBar的样式(含重要的样式属性表及练习示例)

    Styling the Action Bar If you want to implement a visual design that represents your app's brand, th ...

  7. bzoj1565

    很明显是最大权闭合子图,但要注意互相保护的植物打不掉,被互相保护的植物所直接或间接保护的植物也打不掉我们先拓扑排序然后dfs出能打掉的点,然后做最大权闭合子图 ; type node=record p ...

  8. Nginx安装及配置简介

    前言 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大 ...

  9. 使用Apache 的lib进行List、Set、数组之间的转换(转)

    使用Apache Jakarta Commons Collections: import org.apache.commons.collections.CollectionUtils; String[ ...

  10. HDU-5373 The shortest problem

    The shortest problem http://acm.hdu.edu.cn/showproblem.php?pid=5373 Time Limit: 3000/1500 MS (Java/O ...