2013-06-26 54 views
0

我有一個FTP下載文件的方法,但我不保存本地文件,而是通過ftp響應解析文件在內存中。我的問題是,在獲得ftp響應流之後返回流讀者是一種好的做法嗎?因爲不想用相同的方法做解析和其他的東西。從FTP響應的返回流閱讀器是否是好的做法

var uri = new Uri(string.Format("ftp://{0}/{1}/{2}", "somevalue",  remotefolderpath, remotefilename)); 
var request = (FtpWebRequest)FtpWebRequest.Create(uri); 
request.Credentials = new NetworkCredential(userName, password); 

request.Method = WebRequestMethods.Ftp.DownloadFile; 

var ftpResponse = (FtpWebResponse)request.GetResponse(); 
/* Get the FTP Server's Response Stream */ 
ftpStream = ftpResponse.GetResponseStream(); 
return responseStream = new StreamReader(ftpStream); 

回答

1

當您執行HttpWebRequest時,我看到更實用的返回responseStream。如果您使用的是FtpWebRequest這意味着您正在處理文件。我會將responseStream讀爲byte []並返回下載文件的字節文件內容,因此您可以輕鬆地使用類System.IO.File來處理該文件。

0

感謝卡洛斯真的很有幫助。我剛剛返回的byte []

  byte[] buffer = new byte[16 * 1024]; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       int read; 
       while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
       memoryStream=ms; 
      } 
     return memoryStream.ToArray(); 

,並使用字節[]在這樣

public async Task ParseReport(byte[] bytesRead) 
    { 
     Stream stream = new MemoryStream(bytesRead); 
     using (StreamReader reader = new StreamReader(stream)) 
      { 
      string line = null; 
      while (null != (line = reader.ReadLine())) 
      { 
       string[] values = line.Split(';'); 
      } 
      } 
     stream.Close(); 
    } 
1

對我來說有直接使用流,如果你能和他們一起生活的2個缺點的方法,你不應該浪費內存或磁盤空間。

  • 在這個流中,你不能尋求特定的位置,你只能閱讀它的內容;
  • 您的互聯網連接可能會突然中斷,並且在分析和處理文件時會分解異常並分析解析和處理,或者確保處理例程可以處理文件第二次處理的情況(在第一次嘗試中途失敗)。

要解決這些問題,你可以在流複製到一個MemoryStream:

using (var ftpStream = ftpResponse.GetResponseStream())  
{ 
    var memoryStream = new MemoryStream() 
    while ((bytesRead = ftpStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     memoryStream.Write(buffer, 0, bytesRead); 
    } 

    memoryStream.Flush(); 
    memoryStream.Position = 0; 
    return memoryStream;     
} 

如果使用的是較大的文件,我更喜歡它寫入到文件的工作,這樣一來你儘量減少內存佔用您的應用程序:

using (var ftpStream = ftpResponse.GetResponseStream())  
{ 
    var fileStream = new FileStream(Path.GetTempFileName(), FileMode.CreateNew) 
    while ((bytesRead = ftpStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fileStream.Write(buffer, 0, bytesRead); 
    } 

    fileStream.Flush();  
    fileStream.Position = 0; 
    return fileStream; 
} 
+0

似乎有一個錯字:'而((bytesRead = ftpStream.Read ...' 單等號VS雙。 –

相關問題