涉及知識點:
1.通常我們操作的File類,FileStream,StreamWriter,StreamReader都是在System.IO命名空間下的。
2.File類和FileStream類操作文件的區別在於,File相當於一次性讀取或寫入整個文件,可能會增加內存負擔,而使用FileStream則可以在讀取或者寫入的時候指定操作的字節數(有點類似於數據庫分頁查詢的效果),從而減輕對內存的開銷。(另File是靜態類,FileStream,StreamWriter,StreamReader則是非靜態類)。
3.FileStream和StreamWriter,StreamReader的區別在於,StreamWriter,StreamReader只能操作文本文件,而FileStream既可以操作文本文件,也可以操作多媒體文件。
4.FileStream,StreamWriter,StreamReader類每次使用完成後,因為GC無法清理他們的所產生的垃圾,所以我們必須手動調用Close(),Dispose()方法。
5.凡是類(或基類)實現IDisposable接口,則我們可以用using語法自動清理他們產生的垃圾,無需調用Close(),Dispose()方法。常見的類如ado.net中的SqlConnection,SqlCommand類和本文中的FileStream,StreamWriter,StreamReader類。
代碼如下
static void CopyFile(string source, string target) { if (!File.Exists(source)) { throw new Exception("源文件不存在"); } //創建一個負責讀取的流 using (FileStream sfReader = new FileStream(source, FileMode.Open, FileAccess.Read)) { //創建一個負責寫入的流 using (FileStream sfWriter = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write)) { //每次讀取5M大小 byte[] buffer = new byte[1024 * 1024 * 5]; int size = 0; do { //返回的size為讀取到的實際字節數,可能等於5M,也可能小於5M size = sfReader.Read(buffer, 0, buffer.Length); //最後一個參數是實際字節數,而不是5M。 //如果這裡將size換成buffer.Length,當實際字節數不足5M時,會有很空字節填充。 sfWriter.Write(buffer, 0, size); } while (size != 0); }//using的作用,所以程序執行到這裡時,會自動釋放sfWriter的資源,無需手動調用Dispose() }; } View Code
調用方式
//利用FileStream實現多媒體文件復制 string source = @"C:\Users\Administrator\Desktop\source.avi"; string target = @"C:\Users\Administrator\Desktop\target.avi"; CopyFile(source, target); View Code