C# + FTP

Введение


В Microsoft .Net framework 2.0 и более поздних версиях есть встроенная поддержка FTP. До ее появления необходимо было пользоваться различными библиотеками. Но теперь, гораздо приятнее использовать стандартную библиотеку классов.
Ниже представленный код не описывает все возможности, этой библиотеки, скорее он показывает основные части кода, которые будут использоваться практически везде.


Код


Не забудьте добавить в заголовок:

using System.Net;
using System.IO;

Общая процедура создания FTP запроса, используя объект FtpWebRequest, выглядиь так:

  1. Создать FtpWebRequest объект, ссылкой на FTP
  2. Установить FTP метод, для выполнения (скачать, загрузить, и т.д.)
  3. Установить опции соединения (поддержка SSL, режим передачи: бинарный/другой и т.д.) для FTP запроса
  4. Установить логин и пароль для соединения
  5. Выполнить запрос.
  6. Получить ответ в поток (если нужно).
  7. Закрыть FTP запрос и все открытые потоки


Объект, FtpWebRequest позволяет настраивать многие нюансы подключения к FTP.
Вот некоторые из свойств объекта FtpWebRequest:

  • Credentials – логин и пароль для подключения к FTP серверу.
  • KeepAlive – указывает, разрывать ли соединение после выполнения запроса или нет. По умолчанию его значение true.
  • UseBinary – указывает какой из типов передачи данных использовать, бинарный, или ASCII.
  • UsePassive – определяет режим подключения и работы клиента с сервером.
  • Contentlength – это свойство определяет размер загружаемого на сервер файла.
  • Method – определяет тип действия (команды) которое необходимо выполнить (загрузить, скачать, получить список файлов и т.д.)

Загрузка

 private void Upload(string filename)
{
  FileInfo fileInf = new FileInfo(filename);
  string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
  FtpWebRequest reqFTP;
  // Создание объекта FtpWebRequest
  reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri( "ftp://" + ftpServerIP + "/" + fileInf.Name));
  // Задание логина и пароля
  reqFTP.Credentials = new NetworkCredential(ftpUserID,  ftpPassword);
   // По умолчанию KeepAlive установлен как true, поэтому соединение не закрывается после выполнения запроса
  reqFTP.KeepAlive = false;
  // Установка команды серверу
  reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
  // Установка типа передачи данных
  reqFTP.UseBinary = true;
  //Оповещение сервера, о размере загружаемого файла
  reqFTP.ContentLength = fileInf.Length;
  // Размер будет – 2 КБ
  int buffLength = 2048;
  byte[] buff = new byte;
  int contentLen;
  // Открытие файлового потока (System.IO.FileStream) на чтение загружаемого файла
  FileStream fs = fileInf.OpenRead();
  try
  {
        // Поток, через который файл уйдет на сервер
        Stream strm = reqFTP.GetRequestStream();
         //Чтение из файла по 2 Кбайта за раз
        contentLen = fs.Read(buff, 0, buffLength);
        // пока файл не закончится
        while (contentLen != 0)
        {
            // Запись из потока файла, в поток загрузки на сервер
            strm.Write(buff, 0, contentLen);
            contentLen = fs.Read(buff, 0, buffLength);
        }
        // Закрытие потоков
        strm.Close();
        fs.Close();
  }
  catch(Exception ex)
    {
        MessageBox.Show(ex.Message, "Upload Error");
    }
}

Скачивание

 private void Download(string filePath, string fileName)
{
    FtpWebRequest reqFTP;
    try
    {
        //filePath = <<полный путь к файлу, где он будет сохранен>>,
        //fileName = <<имя файла>>
        FileStream outputStream = new FileStream(filePath + "\\\\" + fileName, FileMode.Create);
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream ftpStream = response.GetResponseStream();
        long cl = response.ContentLength;
        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte;
        readCount = ftpStream.Read(buffer, 0, bufferSize);
        while (readCount > 0)
        {
            outputStream.Write(buffer, 0, readCount);
            readCount = ftpStream.Read(buffer, 0, bufferSize);
        }
        ftpStream.Close();
        outputStream.Close();
        response.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


Другие возможные действия, можно выполнить, используя методы Rename, Delete, GetFileSize, FileListDetails, MakeDir.