Как правильно очистить ресурсы после операции FTP? - PullRequest
4 голосов
/ 10 апреля 2011

Что мне делать после загрузки файла по FTP?Обычно я просто закрываю два потока:

sourceStream.Close();
requestStream.Close();

Каков будет эффект, если они останутся открытыми?Могут ли другие пользователи войти в систему, используя те же учетные данные?Смогу ли я войти снова?

Вот полный код для лучшего понимания:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(
                          "bbbbb" + "bbbbbb" + "bbb/" + hj + "/" + hjj + ".txt");
request.Credentials = new NetworkCredential("bbbbb", "bbbbbb");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UsePassive = true;

StreamReader sourceStream = new StreamReader(j + @"oo.txt");
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;

Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);

sourceStream.Close();
requestStream.Close();

Кроме того, иногда у меня есть только метод request.open, которому не назначен метод close(), а затемЯ использую request.Abort() в самом конце операции FTP.Имеет ли это смысл?

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

Ну, документация MSDN гласит:

При использовании объекта FtpWebRequest для загрузки файла на сервер необходимо записать содержимое файла в поток запросов, полученный путем вызова метода GetRequestStream или его асинхронных аналогов, методов BeginGetRequestStream и EndGetRequestStream. Вы должны написать в поток и закрыть поток перед отправкой запроса.

, который указывает, что могут произойти плохие вещи, если вы не закроете поток запросов. Если вы не закроете исходный поток, вы, скорее всего, в конечном итоге заблокируете файл, отказывая в доступе для будущего запроса и / или других пользователей - хотя это зависит от базовой ОС и режима общего доступа к файлу.

Что касается закрытия запроса: я не использовал WebRequest & Co, однако, следуя вышеупомянутой документации MSDN, кажется, что вы должны следовать шаблону

  • Создать заявку
  • Получить поток запросов
  • Введите ваши данные
  • Закрыть поток запросов
  • Получить ответ
  • Закрыть объект ответа (который, я полагаю, завершает запрос)

Вероятно, это хорошая идея, если вы не знаете иначе.

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

Вот способ, который немного чище, использует меньше потоков и правильно закрывает их по завершении.

Uri requestUri = new Uri(string.Concat("bbbbb", "bbbbbb", "bbb/", hj, "/", hjj, ".txt"));
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(requestUri);
request.Credentials = new NetworkCredential("bbbbb", "bbbbbb");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UsePassive = true;

byte[] fileContents = File.ReadAllBytes(@"oo.txt");
request.ContentLength = fileContents.Length;

using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(fileContents, 0, fileContents.Length);
}

WebRequest.Abort предназначен для завершения асинхронных операций, которых у вас нет.Не называй это здесь.Пожалуйста, изучите заявление using, которое я включил, как это было предложено в комментариях Митча Уитта.Он автоматически удалит объект потока.

Что касается других вопросов, конечно, кто-то может использовать те же учетные данные для входа на FTP-сервер, но не в результате вашего кода.Те же учетные данные всегда будут входить в систему успешно.Я думаю, вы беспокоитесь о том, чтобы оставить соединение активным, но это проблема для сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...