大文件拷贝(文件流的使用)、文件编码

首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一次性加载到内存中;事实上,内存也不允许这么干),所以在C#中出现了内存流这个东西。先看下面的内容,File类中的常用读取文件方法会将文件内容一次性全部加载到内存中

1             string sPath = @"C:\Users\Chens-PC\Desktop\Nginx.txt";
2             //File类的ReadAllBytes()方法会将文本内容一次性读取到内存中,然后以byte数组返回(同时关闭文件)。
3             byte[] bteData = File.ReadAllBytes(sPath);
4             //File类的ReadAllLines()方法会将文本内容一次性逐行读取到内存中,然后以string数组返回(同时关闭文件),它的重载能指定读取时使用的编码。
5             string[] strData = File.ReadAllLines(sPath);
6             //File类的ReadAllText()方法会将文本内容一次性读取到内存中,然后以string字符串返回(同时关闭文件),它的重载能指定读取时使用的编码。
7             string sData = File.ReadAllText(sPath);

注:上面的代码,在传参时为Encoding.Default(表示与当前操作系统编码一致,一般是简体中文ANSI),而DotNet新建文本文件编码为UTF-8.

在进行大文件拷贝之前,先说一下,如果使用文件流(FileStream):

 1            #region 通过文件流写文件
 2             string sMsg = "风儿吹来了童年的一幅画 你陪着我在那过家家 竹林是我们的家 竹叶是你送我的花 抬头见你笑得那么的无暇";
 3             using (FileStream fsWrite = new FileStream("msg.txt", FileMode.Create, FileAccess.Write))
 4             {
 5                 byte[] bteData = System.Text.Encoding.UTF8.GetBytes(sMsg);
 6                 fsWrite.Write(bteData, 0, bteData.Length);
 7                 fsWrite.Flush();
 8             }
 9             Console.WriteLine("文件写入完毕!");
10             #endregion
 1             #region 通过文件流读文件
 2             using (FileStream fsRead = new FileStream("msg.txt", FileMode.Open, FileAccess.Read))
 3             {
 4                 byte[] bteData = new byte[fsRead.Length];
 5                 fsRead.Read(bteData, 0, bteData.Length);
 6                 //将byte[]数组转换成字符串时才需要指定编码。
 7                 string s = System.Text.Encoding.UTF8.GetString(bteData);
 8                 Console.WriteLine(s);
 9             }
10             #endregion

1.大文件拷贝:

     思路:考虑到大文件的拷贝要边读边写,故要创建2个文件流(一个读,一个写),案例的代码如下(winform照样适用):

1              #region 大文件拷贝
2             string sSource = @"F:\系统\cn_windows_7_ultimate_with_sp1_x86_dvd_618763.iso";
3             string sTarget = @"E:\C#练习第一天\windows_7.iso";
4 
5             CopyBigFile(sSource, sTarget);
6             Console.ReadKey();
7             #endregion
View Code

相关文章: