與Java中的各種檔案流,網路流類似,.net中也有各類流。流的主要用途就是與應用程式外部的檔案或資料來源進行資料互動。基類為Stream,定義在命名空間System.IO下;
一,使用流進行一次性的複製寫入
首先我們在案頭上建個測試用的檔案,寫入些東西:
之後是我們的代碼:
#region 使用流進行一次性複製 //建立一個檔案流對象(參數一:指定了檔案的位置;參數二:枚舉值,指定作業系統開啟檔案的方式;參數三:表明了開啟檔案的意圖;注意第二個參數與第三個參數要注意搭配使用) Stream source = new FileStream(@"C:/Users/v-liuhch/Desktop/StreamTest.txt", FileMode.Open, FileAccess.Read); byte[] buffer = new byte[source.Length]; //將檔案資料寫入到位元組數組中(參數一:要寫入的位元組數組; 參數二:用於設定檔案從哪個位置開始讀取;參數三:讀取的位元組數) int byteRead = source.Read(buffer, 0, (int)source.Length);//傳回值為讀取到的位元組數 //foreach (var b in buffer) //{ // // Console.WriteLine(Convert.ToString(b, 2));//二進位 // //Console.WriteLine(Convert.ToString(b, 10));//十進位 // Console.WriteLine(Convert.ToString(b, 16).ToUpper());//十六進位 //} //Console.ReadKey(); //將檔案寫入StreamTarget.txt using (Stream target = new FileStream(@"C:/Users/v-liuhch/Desktop/StreamTarget.txt", FileMode.Create, FileAccess.Write)) { target.Write(buffer, 0, buffer.Length); } source.Dispose(); #endregion
注意如果不使用using,別忘了dispose.
二,迴圈分批的複製
為了測試下面這段代碼,建議找個大點兒的檔案啥滴。
#region 迴圈分批覆制 /*問題出現背景: 傳遞一個更大的檔案; * 事先無法得知檔案的大小,例如讀取網路檔案; * 上述情況不能建立一個尺寸正好合適的byte[]數組,此時只能分批讀取和寫入,每次唯讀取部分位元組,直到檔案尾部; */ int BufferSize = 10240;//10KB using ( Stream source = new FileStream(@"C:/Users/v-liuhch/Desktop/sherlock.wmv", FileMode.Open, FileAccess.Read)) { using (Stream target = new FileStream(@"C:/Users/v-liuhch/Desktop/sherlockCopy.wmv", FileMode.Create, FileAccess.Write)) { byte[] buffer = new byte[BufferSize]; int bytesRead; do { bytesRead = source.Read(buffer, 0, BufferSize); target.Write(buffer, 0, bytesRead); } while (bytesRead > 0); } } #endregion
PS:建議使用using;
對大檔案採取分割讀取的方式還是比較科學滴,類似大檔案上傳的原理。
以上就是.net 流——使用流進行檔案複製的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!