2014-10-30 57 views
1

我通過FTP發送大文件(3GB)在C#和同時閱讀源碼流文件時,我這樣做,我歌廳的錯誤:錯誤在發送大文件的通過量FTP

StreamReader sourceStream = new StreamReader(@"C:\xxx\xxxx\xxx"); 
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 

錯誤:

類型 '的System.OutOfMemoryException' 的未處理的異常在mscorlib.dll發生

整個代碼:

// Get the object used to communicate with the server. 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://xxx.xxx.xxx.xxx/file.iso"); 
request.Method = WebRequestMethods.Ftp.UploadFile; 

// This example assumes the FTP site uses anonymous logon. 
request.Credentials = new NetworkCredential("user", "mdp"); 

// Copy the contents of the file to the request stream. 
StreamReader sourceStream = new StreamReader(@"C:\xxx\xxx\xxx\xxxxxxxxx.iso"); 

byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
sourceStream.Close(); 
request.ContentLength = fileContents.Length; 

Stream requestStream = request.GetRequestStream(); 
requestStream.Write(fileContents, 0, fileContents.Length); 
requestStream.Close(); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

response.Close(); 
+1

你將不得不在少量(數據包)發送,但將需要把支票recieving結束,看它是否已收到所有 – ZoomVirus 2014-10-30 13:05:45

+0

你讀所有的文件到內存。機器上有多少內存? – Reniuz 2014-10-30 13:05:47

+0

謝謝@ZoomVirus,但是你現在怎麼發送它?我從來沒有使用過這種東西。 – 2014-10-30 13:10:37

回答

0

您無法將3GB文件讀入內存緩衝區。你必須做流式傳輸。使用文件流讀取預定義的緩衝區,然後將其寫入到ftp流。繼續,直到到達文件流結尾。

// Get the object used to communicate with the server. 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://xxx.xxx.xxx.xxx/file.iso"); 
request.Method = WebRequestMethods.Ftp.UploadFile; 

// This example assumes the FTP site uses anonymous logon. 
request.Credentials = new NetworkCredential("user", "mdp"); 

// Copy the contents of the file to the request stream. 
using (Stream sourceStream = File.OpenRead(@"C:\xxx\xxx\xxx\xxxxxxxxx.iso")) 
using(Stream reqStrm = request.GetRequestStream()) 
{ 

    byte[] buffer = new byte[1024 * 1024]; //1 MB buffer 
    int count = 0; 
    do 
    { 
     count = sourceStream.Read(buffer, 0, buffer.Length); 
     if (count > 0) 
     { 
      reqStrm.Write(buffer, 0, count); 
     } 
    } 
    while (count > 0); 
}   
FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
response.Close(); 
+0

謝謝你的回覆和你的答案,它完美的作品:) – 2014-10-31 09:49:37

+0

如果它適合你,那麼請投票並接受答案。 – loopedcode 2014-10-31 15:03:56