Начиная с версии .NET 6 microsoft НЕ рекомендует использовать данный API для работы с FTP и при необходимости для работы с FTP рекомендует обращаться к сторонним библиотекам.
Для выполнения запросов в протоколе FTP используются команды. Например, команда LIST
предназначена для получения списка файлов каталога сервера,
команда STOR
применяется для сохранения файла и так далее. В .NET для отправки нужной команды нам не надо запихивать ее в тело запроса,
так как можно использовать свойство Method
класса FtpWebRequest.
Этот метод в качестве значения принимает строки, определенные в классе WebRequestMethods.Ftp:
AppendFile
: добавляет в запрос команду APPE, которая используется для присоединения файла к существующему файлу на FTP-сервере
DeleteFile
: добавляет в запрос команду DELE, которая используется для удаления файла на FTP-сервере
DownloadFile
: добавляет команду RETR, которая используется для загрузки файла
GetDateTimestamp
: представляет команду MDTM, которая применяется для получения даты и времени из файла
GetFileSize
: команда SIZE, получение размера файла
ListDirectory
: команда NLIST, возвращает краткий список файлов на сервере
ListDirectoryDetails
: команда LIST, возвращает подробный список файлов на FTP-сервере
MakeDirectory
: команда MKD, создает каталог на FTP-сервере
PrintWorkingDirectory
: команда PWD, отображает имя текущего рабочего каталога
RemoveDirectory
: команда RMD, удаляет каталог
Rename
: команда RENAME, переименовывает каталог
UploadFile
: команда STOR, загружает файл на FTP-сервер
UploadFileWithUniqueName
: команда STOU, загружает файл с уникальным именем на FTP-сервер
Однако в реальности при работе с конкретными ftp-серверами нам не все эти команды будут доступны в силу ограничений на чтение/запись на стороне сервера, которые может установить администратор.
Например, загрузим текстовый файл на фтп-сервер:
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/hellow.txt"); // устанавливаем метод на загрузку файлов request.Method = WebRequestMethods.Ftp.UploadFile; // создаем поток для загрузки файла FileStream fs = new FileStream("D://test.txt", FileMode.Open); byte[] fileContents = new byte[fs.Length]; fs.Read(fileContents, 0, fileContents.Length); fs.Close(); request.ContentLength = fileContents.Length; // пишем считанный в массив байтов файл в выходной поток Stream requestStream = request.GetRequestStream(); requestStream.Write(fileContents, 0, fileContents.Length); requestStream.Close(); // получаем ответ от сервера в виде объекта FtpWebResponse FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("Загрузка файлов завершена. Статус: {0}", response.StatusDescription); response.Close(); Console.Read(); } } }
Для загрузки на сервер у нас, естественно, должны быть права на запись. Возможно, потребуется установить логин и пароль для доступа к серверу.
С помощью другой команды получим содержимое сервера:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1/"); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("Содержимое сервера:"); Console.WriteLine(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); Console.WriteLine(reader.ReadToEnd()); reader.Close(); responseStream.Close(); response.Close(); Console.Read();
Поскольку в данном случае сервер возвращает текстовую информацию о файлах и каталогах, то с помощью объекта StreamReader мы можем считать ее и вывести на консоль: