大文件拷贝(文件流的使用)、文件编码
首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个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