zl程序教程

您现在的位置是:首页 >  其他

当前栏目

FileStream大文件复制

文件 复制 FileStream
2023-09-14 09:00:59 时间

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

复制代码
 1 public static class FileHelper

 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)

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)

21 byte[] buffer = new byte[eachReadLength];

22 long copied = 0;

23 while (copied = fromFile.Length - eachReadLength)

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;

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();

41 else

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();

51 fromFile.Close();

52 toFile.Close();

53 return true;

55 }
复制代码

测试代码:

复制代码
 1 class Program

 3 static void Main(string[] args)

 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))

10 watch.Stop();

11 Console.WriteLine("拷贝完成,耗时:" + watch.Elapsed.Seconds+"秒");

14 Console.Read();

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/p/3345392.html
(二)目录及文件操作 命令:ls[选项][目录/文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。 对于文件,将列出文件名及其他