2014-10-30 69 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