Начиная с версии .NET 6 microsoft НЕ рекомендует использовать данный API для работы с FTP и при необходимости для работы с FTP рекомендует обращаться к сторонним библиотекам.
Протокол FTP (File Transfer Protocol) предназначен для передачи файлов по сети. Он работает поверх протокола TCP и использует 21 порт. Однако так как это довольно используемый протокол, и чтобы разработчикам не приходилось с нуля создавать весь функционал, используя TCP-сокеты, в библиотеке классов .NET уже есть готовые решения. Эти решения представляют классы FtpWebRequest и FtpWebResponse. Эти классы являются производными от WebRequest и WebResponse и позволяют отправлять запрос к FTP-серверу и получать от него ответ.
FtpWebRequest позволяет отправить запрос к серверу. Для настройки запроса мы можем использовать следующие его свойства:
Credentials
: задает или возвращает аутентификационные данные пользователя
EnableSsl
: указывает, надо ли использовать ssl-соединение
Method
: задает команду протокола FTP, которая будет использоваться в запросе
UsePassive
: при значении true устанавливает пассивный режим запроса к серверу
UseBinary
: указывает тип данных, которые будут использоваться в запросе. Значение true указывает, что передаваемые данные являются двоичными, а
значение false - что данные будут представлять текст. Значение по умолчанию — true
Например, загрузим текстовый файл с фтп-сервера:
using System; using System.IO; using System.Net; using System.Text; namespace FtpConsoleClient { class Program { static void Main(string[] args) { // Создаем объект FtpWebRequest FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1/test.txt"); // устанавливаем метод на загрузку файлов request.Method = WebRequestMethods.Ftp.DownloadFile; // если требуется логин и пароль, устанавливаем их //request.Credentials = new NetworkCredential("login", "password"); //request.EnableSsl = true; // если используется ssl // получаем ответ от сервера в виде объекта FtpWebResponse FtpWebResponse response = (FtpWebResponse)request.GetResponse(); // получаем поток ответа Stream responseStream = response.GetResponseStream(); // сохраняем файл в дисковой системе // создаем поток для сохранения файла FileStream fs = new FileStream("newTest.txt",FileMode.Create); //Буфер для считываемых данных byte[] buffer = new byte[64]; int size = 0; while ((size = responseStream.Read(buffer, 0, buffer.Length)) > 0) { fs.Write(buffer, 0, size); } fs.Close(); response.Close(); Console.WriteLine("Загрузка и сохранение файла завершены"); Console.Read(); } } }
В данном случае идет обращение к фтп-серверу "ftp://127.0.0.1", который я поднял на локальном компьютере, но это может быть любой адрес рабочего фтп-сервера. Если нам надо просто загрузить файл, то мы можем использовать метод
request.Method = WebRequestMethods.Ftp.DownloadFile
При отправке запроса нам надо указать соответствующий метод.
Если фтп-сервер требует установки логина и пароля, то применяется свойство Credentials:
request.Credentials = new NetworkCredential("login", "password");
Если сервер использует ssl-соединение, то надо его установить в запросе: request.EnableSsl = true
После отправки запроса мы можем получить ответ в виде FtpWebResponse:
FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream();
Получив поток ответа, мы можем им манипулировать. В данном случае с помощью FileStream сохраняем файл в папку программы под именем newTest.txt.