Ftp Загрузка большого файла приводит к зависанию приложения VB.Net на Stream.Close () - PullRequest
3 голосов
/ 22 июня 2011

Я пытаюсь загрузить большой файл (более 50 МБ) на мой веб-сервер, но мое приложение зависает при попытке закрыть поток.Если размер загружаемого файла превышает 50 МБ, то метод .Close () приводит к его зависанию - сообщение об ошибке вообще отсутствует - однако файл размером менее 50 МБ завершается успешно.

Что вы предлагаете обойти 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 Studio2010 и .Net Framework 4.0

Ответы [ 3 ]

1 голос
/ 02 марта 2013

Я заметил, что вы не закрыли входной файловый поток (фс). У меня есть процесс, который FTP файл и затем перемещает его в «успешную» папку. Поскольку fs не была закрыта, я получил «файл, используемый другим процессом», когда попытался переместить его. Я поймал это в Try-catch. Я не уверен, что это так, так как вы говорите, что 50 МБ файлов успешно, но это мысль.

Я собираюсь вставить fs.close() и посмотреть, позаботится ли это о моей ошибке. Я переместил файл размером 189 МБ, что заняло некоторое время с подключением, которое я использовал ... но, похоже, оно работало вплоть до переезда.

0 голосов
/ 10 апреля 2012

Я думаю, вам может понадобиться увеличить время ожидания.

Поместите Try-Catch вне цикла, чтобы перехватить возвращаемую ошибку, вы можете найти ошибку:

базовое соединение было закрыто

Надеюсь, это поможет!

0 голосов
/ 30 августа 2011

Итак, сам ли файл поступил на FTP? Если так, то обходной путь - просто прервать процесс в данный момент и оставить его.

Вы пробовали возиться с настройками?

...