2009-02-02 44 views
1

我想加入一些在下載過程中分割的二進制文件。該要求源於項目http://asproxy.sourceforge.net/。在這個項目中,作者允許你通過提供一個url來下載文件。加入已通過下載分割的二進制文件

問題出在我的服務器沒有足夠內存來保存大於20兆內存的文件。所以爲了解決這個問題,我修改了代碼,不下載大於10兆的文件,如果文件是更大的,它會允許用戶下載前10個兆字節。然後用戶必須繼續下載,並希望獲得第二個10兆。現在我已經得到了所有這些工作,除非用戶需要加入他們下載的文件時,我最終會得到損壞的文件,只要我可以通過下載來添加或刪除某些內容。

我目前通過閱讀所有的文件,然後將它們寫入一個文件,一起加入文件。這應該工作,因爲我正在讀取和寫入字節。我用來加入文件的代碼在這裏列出​​

我沒有確切的代碼與我atm,只要我在家我會發布確切的代碼,如果任何人願意幫忙。

請讓我知道,如果我錯過任何東西或者有更好的方法來做到這一點,即我可以用什麼作爲內存流的替代方案。我修改的原始項目的源代碼可以在這裏找到http://asproxy.sourceforge.net/download.html,應該指出我使用的是5.0版本。我修改的文件名爲WebDataCore.cs,我修改了第606行,直到10兆數據被載入繼續執行。

讓我知道是否有任何我錯過了。

感謝

回答

2

最後,我發現通過使用FTP請求,我能夠解決內存問題,並且文件被正確保存。

感謝所有幫助

3

你不應該分裂的記憶原因...分裂的原因通常是爲了避免重新下載失敗的情況下一切。如果內存是一個問題,你就錯了......例如,你不應該在內存中緩衝。

下載文件的最簡單方法就是:

using(WebClient client = new WebClient()) { 
    client.DownloadFile(remoteUrl, localPath); 
} 

重新將拆分/加入代碼 - 再次,問題是,你是緩衝內存中的所有; File.ReadAllBytes是一件壞事,除非你知道你有小文件。你應該有什麼類似的:

byte[] buffer = new byte[8192]; // why not... 
int read; 
while((read = inStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    outStream.Write(buffer, 0, read); 
} 

這使用一個溫和的緩衝區來作爲一個流的兩個泵之間的數據。效率更高。循環說:

  • 嘗試讀一些數據(最多,緩衝區大小)
  • (這將至少讀1個字節,或者我們已經到達流的末尾)
  • 如果我們讀到的東西,寫從緩衝區這麼多字節輸出
+0

謝謝,夥計,你的代碼看起來很完美,除了我不知道如何將我落實到項目這是在流並在數據被寫入了是對另一端的地方項目。我可以多求一點幫助嗎? – RC1140 2009-02-02 12:09:33

+0

有什麼具體問題嗎? – 2009-02-02 12:54:18

1

這個例子是加載每個整個塊到內存中,而不是你可以做這樣的事情:

int bufSize = 1024 * 32; 
byte[] buffer = new byte[bufSize]; 

using (FileStream outputFile = new FileStream(OutputFileName, FileMode.OpenOrCreate, 
FileAccess.Write, FileShare.None, bufSize)) 
{ 
    foreach (string inputFileName in inputFiles) 
    { 
     using (FileStream inputFile = new FileStream(inputFileName, FileMode.Append, 
      FileAccess.Write, FileShare.None, buffer.Length)) 
    { 
    int bytesRead = 0; 

    while ((bytesRead = inputFile.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     outputFile.Write(buffer, 0, bytesRead); 
    } 
} 
相關問題