2012-10-10 94 views
0

可能重複:
Best way to copy between two Stream instances - C#複製文件

我知道我可以使用File.Copy但是,我更感興趣的是做一個更長的路輪,只是教育目的。

現在,我想討論的方法是使用StreamReader和StreamWriter(或FileStreams)。

在我看來,我會將文件(二進制)讀入內存,然後將文件寫入新位置。這可能會導致錯誤發生,因爲
1)整個文件正在加載到內存中(我不知道該文件有多大)和
2)與複製一個字節,粘貼一個字節(我假設流是如何工作的),因爲在粘貼甚至開始之前,我們不得不等待整個文件存儲在內存中。

所以,要問一個很長的路要走,我將如何流複製和粘貼作業?

+2

這很簡單:讀一個塊,寫一個塊直到EOF。但你有什麼嘗試? – CodeCaster

+0

你試過什麼???????????? –

+0

@raman我已經嘗試了幾件事情,最終進入了一個循環 - 然後我開始尋找線路,其他所有答案都表明了不同的路線。不同路線的問題是我不知道路線是否好,因此最好問這個網站,其他人可以評論這樣的建議 – Dave

回答

4

所以,要問一個很長的路要走,我該如何流複製和粘貼作業?

而不是單獨地讀取或者每個字節到內存中,或整個文件到內存中,你會去中途之間 - 創建一個緩衝區,例如32K,並要求輸入流讀取那麼多數據。寫出你讀過的許多字節,然後重複,直到沒有更多的數據要讀取。因此,像:

public void Copy(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32 * 1024]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 

這是效率不高,因爲它可能潛在是,因爲你不讀,並在同一時間寫作。異步IO可以解決這個問題,但是使其更加複雜 - 而且完全有可能操作系統足夠聰明,可以在你編寫代碼的同時繼續閱讀......

請注意,你肯定會想要使用除非您實際上正在閱讀文本,否則不要使用Stream而不是TextReader/TextWriter

+0

完美的,正是我希望的答案類型(和你的書從亞馬遜今天到達)) – Dave

+0

_「正是我希望的答案的類型」_ - 然後將你的想法結合到你的下一個問題。我們無法猜測你在想什麼。 ;-) – CodeCaster

+0

@DaveRook:查看示例代碼的編輯 - 具有諷刺意味的是,這與您在書中找到的地方几乎相同:) –

1
  1. 創建一個空的目標文件
  2. 閱讀從源文件的緩衝區(可以說1024個字節)
  3. 寫緩衝區的destionation文件
  4. 與2重複,直到一切都做
2

您可以以1 MB爲單位讀取/寫入文件(例如)。 MSDN has an example它顯示瞭如何做到這一點。