2013-05-27 52 views
0

我正在建立一些代碼,通過FtpWebRequest下載圖片。當我收集對DownloadFile流的響應時,我能夠將內存中的圖像返回到調用函數的唯一方法是使用MyResponseStream.CopyTo(MyMemoryStream),然後使用Return MyMemoryStream。這有效,但我不明白爲什麼我需要在內存中創建一個圖像的兩個副本(可能會非常大)。當我試圖直接返回MyResponseStream時,代碼只是掛在空間的某個地方,我不得不停止調試器。爲什麼我必須將FTP流複製到另一個變量才能將其返回給調用方法?

爲什麼我不能這樣做?:Return MyResponseStream在下面的代碼中?

Imports System.IO 
Imports System.Net 

Public Function GetJpgImage(ByVal ImageID As Integer) 
    'returns image file from server in a memoryStream 
    'code from: http://www.dreamincode.net/forums/topic/77912-ftp-download-delete/ 

    'build requested file string 
    Dim MyRequestedFile As String 
    MyRequestedFile = ImageID.ToString & ".jpg" 

    'create FTP request 
    Dim ftpRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://mysite.com/www/downloads/" & MyRequestedFile), FtpWebRequest) 
    ftpRequest.Credentials = New NetworkCredential("mySpecialUser", "superSecretPwd") 
    ftpRequest.UseBinary = True 
    ftpRequest.KeepAlive = False 'No Zombies 

    'check if file exists (sigh... do it later) 

    'select download method 
    ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile 

    'setup for response 
    Dim MyMemoryStream As New MemoryStream 
    Dim FTPResponse As FtpWebResponse = DirectCast(ftpRequest.GetResponse, FtpWebResponse) 

    'send request and return memoryStream 
    Using MyResponseStream As IO.Stream = FTPResponse.GetResponseStream 
     'copy to memory stream so we can close the FTP connection 
     MyResponseStream.CopyTo(MyMemoryStream) '<== Why God? Why? 
     'close FTP stream 
     MyResponseStream.Close() 
     'gimme my data! 
     Return MyMemoryStream 
    End Using 
End Function 

它沒有任何與MyResponseStreamUsing聲明(我試過)之中。 VS 2012,Win8。

回答

1

你爲什麼不具備的功能聲明如下:

Public Function GetJpgImage(ByVal ImageID As Integer) as MemoryStream 

,如果你正在返回:

Return MyMemoryStream 

編輯:嘗試改變return語句從使用的,只是爲了測試。 如果您在使用語句 中包含您的退貨並不重要,但只是爲了確保。因爲你所遇到的行爲是不正常的,以及

Using MyResponseStream As IO.Stream = FTPResponse.GetResponseStream 
    'copy to memory stream so we can close the FTP connection 
    MyResponseStream.CopyTo(MyMemoryStream) '<== Why God? Why? 
    'close FTP stream 
    MyResponseStream.Close() 
    'gimme my data! 

End Using 

Return MyMemoryStream 

EDIT2:。如果你不想使用複製到,請嘗試使用傳統的方式來讀取流進的MemoryStream:

MemoryStream memStream; 
using (Stream response = request.GetResponseStream()) { 
    memStream = new MemoryStream(); 

    byte[] buffer = new byte[1024]; 
    int byteCount; 
    do { 
     byteCount = stream.Read(buffer, 0, buffer.Length); 
     memStream.Write(buffer, 0, byteCount); 
    } while (byteCount > 0); 
} 
+0

其實我有它宣稱的方式最初,它似乎並沒有把這個差異題。最後我會再補充一遍。可以肯定的是,我在函數declare中使用'作爲MemoryStream'和'IO.Stream'進行測試。當我嘗試返回'MyResponseStream'時仍然掛起。 – turbonate

+0

更新了我的答案。只是試圖幫助,因爲它真的很奇怪 –

+0

欣賞的想法,讓我在這裏添加一些澄清。在發佈的問題中的代碼作品,但我想弄清楚爲什麼在世界上我不得不使用'CopyTo()'方法來返回流。我嘗試使用DIM語句而不是使用結構,仍然有相同的結果,所以我不認爲'使用'方法是問題。雖然我沒有直接嘗試這個想法,但我已經有效地測試了這個變體,它的工作原理與將它保留在內部一樣。並且基於同樣的想法,我無法將'MyResponseStream'返回到using塊之外,因爲它已經被處理掉了。 – turbonate

相關問題