2011-06-22 51 views
3

我試圖上傳一個大文件(超過50Mb)到我的網絡服務器,但我的應用程序試圖關閉流時掛起。如果上傳的文件大於50Mb,則.Close()會導致它掛起 - 根本沒有錯誤信息 - 但小於50Mb的文件成功。大文件Ftp上傳導致VB.Net應用掛在Stream.Close()

你有什麼建議解決fstream.Close()掛我的應用程序?

Dim target As New Uri(uploadedFilePath) 
Dim fRequest As System.Net.FtpWebRequest = System.Net.WebRequest.Create(target) 
fRequest.Credentials = New System.Net.NetworkCredential(usr, pswd) 
fRequest.KeepAlive = False 
fRequest.Proxy = Nothing 
fRequest.UsePassive = True 
fRequest.UseBinary = True 
fRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 
fRequest.Timeout = 180000 

Dim count As Integer = 0 
Dim readBytes As Integer = 0 
Const bufferLength As Integer = 8192 
Dim buffer As Byte() = New Byte(bufferLength - 1) {} 
Dim fs As FileStream = File.OpenRead(localFileName) 
Dim fStream As Stream = fRequest.GetRequestStream 
Console.WriteLine("Writing bytes to the stream. {0}", String.Format("{0:HH:mm}", Now)) 
Do 
    readBytes = fs.Read(buffer, 0, bufferLength) 
    fStream.Write(buffer, 0, readBytes) 
    count += readBytes 
Loop While readBytes <> 0 
Console.WriteLine("Writing {0} bytes to the stream. {1}", count, String.Format("{0:HH:mm}", Now)) 
fStream.Close() 
Console.WriteLine("fstream Closed {0}", String.Format("{0:HH:mm}", Now)) 

這給輸出:

Writing bytes to the stream. 13:08 

Writing 51391500 bytes to the stream. 13:18 

注意最後Console.Writeline是從來沒有輸出。

PS使用Visual Studio 2010和.NET Framework 4.0

+0

您能否使用普通FTP客戶端程序成功地將大於50mb的文件FTP到服務器? – Femi

+0

絕對是。定期必須建立一個150Mb的文件 - 因此希望自動執行此操作 - 鑑於此應用程序的其他功能是生成該150Mb文件。 – Nigel

+0

您是否找到針對此問題的解決方案?我正在試圖找到解決方案,撕裂我的頭髮! – 2011-10-13 10:22:43

回答

0

所以,做了文件本身的FTP到達?如果是這樣,一個解決方法就是在這個特定時刻切斷流程,並保留它。

你有沒有試過擺弄這些設置?

0

我想你可能只是需要增加超時時間。

把循環外的Try-Catch來誘捕器返回的錯誤,你可能會發現該錯誤是:

基礎連接已經關閉

希望幫助!

1

我注意到你沒有關閉輸入文件流(fs)。我有一個FTP文件的過程,然後將其移動到一個'成功'的文件夾。因爲fs沒有關閉,所以當我嘗試移動它時,我得到了一個「正被另一個進程使用的文件」。我試着抓住了它。我不確定是否是這樣,因爲你說50MB文件成功了,但這是一個想法。

我打算在fs.close()看看是否照顧我的錯誤。我移動了一個189MB的文件,這花費了一些時間與我正在使用的連接,但它似乎一直運行直到移動。