Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама
Татуировка на бедре добавит загадочности и красоты

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Класс FTP

Автор: Александр Уваров
22 ноября 2012 года

Класс FTP предназначен для работы с сервером FTP

Конструктор класса

public FTP (string Host, int Port, string User, string Password)

Создает объект и инициализирует параметры соединения с сервером FTP

Параметры:

  • Host – имя или IP адрес сервера FTP;
  • Port – номер порта сервера FTP;
  • User – имя учетной записи;
  • Password – пароль учетной записи;

Методы класса

public bool UploadFile (string PathFTP, string NameFile)

Записывает файл NameFile на сервер FTP по указанному пути PathFTP.

Параметры:

  • PathFTP – путь;
  • NameFile – имя файла.

Возвращаемый результат:

  • Возвращает true, если запись файла прошла успешно, иначе возвращает false.

Примечание:

  • Путь PathFTP указывается без конечного слэша.

public bool DownloadFile (string NameFileFTP, string NameFileLocal)

Загружает файл NameFileFTP c сервера FTP и записывает загруженный файл, на локальный компьтер с именем NameFileLocal.

Параметры:

  • NameFileFTP – имя файла на сервере FTP;
  • NameFileLocal – имя файла на локальном компьютере.

Возвращаемый результат:

  • Возвращает true, если загрузка файла прошла успешно, иначе возвращает false.

public string[] ListDirectory (string PathFTP, bool Details)

Формирует список файлов и каталогов, находящихся в указанном PathFTP на сервере FTP. 

Параметры:

  • PathFTP – путь к каталогу на сервере FTP;
  • Details – форма выдачи данных. При Details = true полная форма выдачи данных, иначе краткая. Полная форма выдачи данных зависит от платформы, на которой установлен сервер FTP.

Платформа Windows

06-04-10  09:25AM                 Book
06-15-06  10:27AM                 docs
02-20-07  03:13PM                 docum
12-30-10  10:40AM                 Instr
06-30-09  02:04PM                 Monitoring
01-31-11  11:20AM                28027 POOL.RET
03-05-10  01:58PM                 Program
01-31-11  09:44AM                 Tov
01-31-11  11:20AM                97960 user.net
11-24-10  02:00PM                 Бланки
12-18-08  01:46PM               339248 Схема серверов ЦУМР.emf

Платформа Unix

dr-xr-xr-x   1 user     group           0 Feb  3 13:27 ! ВНИМАНИЕ! НОВОСТИ!
dr-xr-xr-x   1 user     group           0 Feb  4 09:40 !Обновление_компонентов
dr-xr-xr-x   1 user     group           0 Jan 24 18:51 .
dr-xr-xr-x   1 user     group           0 Jan 24 18:51 ..
dr-xr-xr-x   1 user     group           0 Jan 21 09:38 1
dr-xr-xr-x   1 user     group           0 Nov  8 11:20 2
dr-xr-xr-x   1 user     group           0 Sep 30 15:39 A-TRANS
dr-xr-xr-x   1 user     group           0 Dec  9 09:36 ARMENIA
dr-xr-xr-x   1 user     group           0 Nov  8  2009 ARMOPD(WIN)
dr-xr-xr-x   1 user     group           0 Jan 13 17:18 ARM_CD
dr-xr-xr-x   1 user     group           0 Nov 25 10:55 DB2_Грузовой _экспресс

Если установлен параметр выдачи краткой формы, функция возвращает строковый массив, состоящий только из списка файлов и каталогов входящих в заданный каталог на сервере FTP.

Возвращаемый результат:

  • Строковый массив списка файлов и каталогов. Если в указанном каталоге, файлов и каталогов нет, возвращается строковый массив нулевой длины.

public string[] ListNameFile (string PathFTP, bool Files)

Формирует список файлов или каталогов, находящихся в указанном PathFTP на сервере FTP. 

Параметры:

  • PathFTP – путь к каталогу на сервере FTP;
  • Files – определяет содержимое списка. При Files = true выдается список файлов, иначе список каталогов.

Возвращаемый результат:

  • Строковый массив списка файлов или каталогов. Еcли в указанном каталоге на сервере FTP файлов или каталогов нет, возвращается строковый массив нулевой длины.

Примечание:

  • Если внутри имени файла или каталога присутствуют пробелы, то такая строка обрамляется в двойные кавычки. Путь PathFTP должен иметь конечный символ “\”.

Свойства класса

public string Err { get; }

Возвращает строку с сообщением об ошибке, возникшей при работе с FTP, или пустую строку, если ошибок нет.

Пример использования класса FTP

Код:
//****************************************
// Пример использования класса FTP
//****************************************

using System;
using SF;

…

// создаем объект
FTP oSF = new FTP("10.240.3.110", 21, "anonymous", "alex@mail.ru");

// запись файла с локального компьютера на сервер FTP
if (oSF.UploadFile(@"Program\User", @"d:\temp\alfa.doc"))
  Console.WriteLine("Файл записан");
else
  Console.WriteLine("Ошибка! " + oSF.Err);

// загрузка файла с сервера FTP на локальный компьютер
if (oSF.DownloadFile(@"Program\User\alfa.doc", @"d:\temp\alfa.doc"))
  Console.WriteLine("Файл загружен");
else
  Console.WriteLine("Ошибка! " + oSF.Err);

// получить список файлов и каталогов по указанному пути
string[] ListDir = oSF.ListDirectory(@"Program\User", false);
if (ListDir.Length > 0) {
  Console.WriteLine("Список файлов:");
  for (int i = 0; i < ListDir.Length; i++)
    Console.WriteLine(ListDir[i]);
}
else
  Console.WriteLine("Список пуст");

// получить только список файлов
string[] ListFile = oSF.ListNameFile(@"Program\User", true);
if (ListFile.Length > 0) {
  Console.WriteLine("Список файлов:");
  for (int i = 0; i < ListFile.Length; i++)
    Console.WriteLine(ListFile[i]);
}
else
  Console.WriteLine("Список пуст");

&hellip;

Код класса

Код:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;


namespace SF {

public struct FileStruct {
  public string Flags;
  public string Owner;
  public string Group;
  public bool IsDirectory;
  public DateTime CreateTime;
  public string Name;
}

public enum FileListStyle {
  UnixStyle,
  WindowsStyle,
  Unknown
}

// Класс для работы с FTP
public class FTP {
  private string Host;
  private int Port;
  private string User;
  private string Password;
  private string Error;

  //*************************************************************
  //* Function: FTP
  //* Notes: Конструктор класса
  //*

  public FTP (string Host, int Port, string User, string Password) {
    this.Host = Host;
    this.Port = Port;
    this.User = User;
    this.Password = Password;
    this.Error = "";
  }

  //*** End of FTP ***********

  //*************************************************************
  //* Function: UploadFile
  //* Notes: Запись файла на FTP
  //*

  public bool UploadFile (string PathFTP, string NameFile) {
    FileInfo InfoFile = new FileInfo(NameFile);
    FtpWebRequest Request;
    string UploadUri = "";

    this.Error = "";
    if (PathFTP == "")
      UploadUri = "ftp://" + this.Host + ":" + this.Port.ToString() + "/" +
                  InfoFile.Name;
    else
      UploadUri = "ftp://" + this.Host + ":" + this.Port.ToString() + "/" +
                  PathFTP + "/" + InfoFile.Name;
    Request = (FtpWebRequest)FtpWebRequest.Create(UploadUri);
    Request.Credentials = new NetworkCredential(this.User, this.Password);
    Request.KeepAlive = false;
    Request.Method = WebRequestMethods.Ftp.UploadFile;
    Request.UseBinary = true;
    Request.ContentLength = InfoFile.Length;
    int BuffLength = 2048;
    byte[] Buff = new byte[BuffLength];
    int ContentLen;
    FileStream FS = InfoFile.OpenRead();
    try {
      Stream Strm = Request.GetRequestStream();
      ContentLen = FS.Read(Buff, 0, BuffLength);
      while (ContentLen != 0) {
        Strm.Write(Buff, 0, ContentLen);
        ContentLen = FS.Read(Buff, 0, BuffLength);
      }
      // закрываем все потоки
      Strm.Close();
      FS.Close();
      return true;
    }
    catch (Exception e) {
      this.Error = e.Message;
      return false;
    }
  }

  //*** End of UploadFile ***********

  //*************************************************************
  //* Function: DownloadFile
  //* Notes: Загружает файл NameFileFTP c сервера  FTP и записывает
  //*        загруженный файл, на локальный компьтер с  именем NameFileLocal.
  //*

  public bool DownloadFile (string NameFileFTP, string NameFileLocal) {
    FtpWebRequest Request;
    string DownloadUri = "";

    try {
      FileStream OutputStream = new FileStream(NameFileLocal, FileMode.Create);
      this.Error = "";
      DownloadUri = "ftp://" + this.Host + ":" + this.Port.ToString() + "/" +
                    NameFileFTP;
      Request = (FtpWebRequest)FtpWebRequest.Create(DownloadUri);
      Request.Method = WebRequestMethods.Ftp.DownloadFile;
      Request.UseBinary = true;
      Request.Credentials = new NetworkCredential(this.User, this.Password);
      FtpWebResponse Response = (FtpWebResponse)Request.GetResponse();

      Stream FtpStream = Response.GetResponseStream();
      long cl = Response.ContentLength;
      int BufferSize = 2048;
      int ReadCount;
      byte[] Buffer = new byte[BufferSize];

      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();
      return true;
    }
    catch (Exception e) {
      this.Error = e.Message;
      return false;
    }
  }

  //*** End of DownloadFile ***********

  //*************************************************************
  //* Function: ListDirectory
  //* Notes: Возвращает строковый массив списка файлов и каталогов,
  //*        находящихся в указанном каталоге
  //*

  public string[] ListDirectory (string PathFTP, bool Details) {
    string[] DownloadFiles;
    StringBuilder Result = new StringBuilder();
    FtpWebRequest Request;
    string UriFTP = "";

    try {
      this.Error = "";
      if (PathFTP == "")
        UriFTP = "ftp://" + this.Host + ":" + this.Port.ToString() + "/";
      else
        UriFTP = "ftp://" + this.Host + ":" + this.Port.ToString() + "/" +
                 PathFTP;
      Request = (FtpWebRequest)FtpWebRequest.Create(UriFTP);
      Request.UseBinary = true;
      Request.Credentials = new NetworkCredential(this.User, this.Password);
      if (Details)
        Request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
      else
        Request.Method = WebRequestMethods.Ftp.ListDirectory;
      WebResponse Response = Request.GetResponse();
      StreamReader Reader = new StreamReader(Response.GetResponseStream(),
                                             Encoding.GetEncoding(1251));
      string Line = Reader.ReadLine();
      while (Line != null) {
        Result.Append(Line);
        Result.Append("\n");
        Line = Reader.ReadLine();
      }
      Reader.Close();
      Response.Close();
      if (Result.Length != 0) {
        Result.Remove(Result.ToString().LastIndexOf('\n'), 1);
        return Result.ToString().Split('\n');
      }
      else {
        return (new string[0]);
      }
    }
    catch (Exception e) {
      this.Error = e.Message;
      DownloadFiles = new string[0];
      return DownloadFiles;
    }
  }

  //*** End of ListDirectory ***********

  //*************************************************************
  //* Function: ListNameFile
  //* Notes: Возвращает строковый массив списка файлов или каталогов
  //*        находящихся в указанном каталоге
  //*

  public string[] ListNameFile (string PathFTP, bool Files) {
    FtpWebRequest Request;
    string[] ListFile;
    string UriFTP = "";
    int NumDir = 0;
    int NumFile = 0;

    try {
      this.Error = "";
      if (PathFTP == "")
        UriFTP = "ftp://" + this.Host + ":" + this.Port.ToString() + "/";
      else
        UriFTP = "ftp://" + this.Host + ":" + this.Port.ToString() + "/" +
                 PathFTP;
      Request = (FtpWebRequest)FtpWebRequest.Create(UriFTP);
      Request.UseBinary = true;
      Request.Credentials = new NetworkCredential(this.User, this.Password);
      Request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
      WebResponse Response = Request.GetResponse();
      StreamReader Reader = new StreamReader(Response.GetResponseStream(),
                                             Encoding.GetEncoding(1251));
      string Datastring = Reader.ReadToEnd();
      Reader.Close();
      Response.Close();
      FileStruct[] List = GetList(Datastring);
      foreach (FileStruct thisstruct in List) {
        if (thisstruct.IsDirectory)
          NumDir++;
        else
          NumFile++;
      }
      if (Files) {
        ListFile = new string[NumFile];
        if (NumFile == 0)
          return ListFile;
      }
      else {
        ListFile = new string[NumDir];
        if (NumDir == 0)
          return ListFile;
      }
      int j = 0;
      for (int i = 0; i < List.Length; i++) {
        if (Files && !List[i].IsDirectory)
          ListFile[j++] = List[i].Name;
        else if (!Files && List[i].IsDirectory)
          ListFile[j++] = List[i].Name;
      }
      return ListFile;
    }
    catch (Exception e) {
      this.Error = e.Message;
      return new string[0];
    }
  }

  //*** End of ListNameFile ***********

  //*************************************************************
  //* Function: GetList
  //*

  private FileStruct[] GetList (string DataStr) {
    List<FileStruct> ListArray = new List<FileStruct>();
    string[] DataRec = DataStr.Split('\n');
    FileListStyle DirListStyle = GetFileListStyle(DataRec);
    foreach (string s in DataRec) {
      if (DirListStyle != FileListStyle.Unknown && s != "") {
        FileStruct FS = new FileStruct();
        FS.Name = "..";
        switch (DirListStyle) {
          case FileListStyle.UnixStyle:
            FS = ParseFileStructUnixStyle(s);
            break;
          case FileListStyle.WindowsStyle:
            FS = ParseFileStructWindowsStyle(s);
            break;
        }
        if (!(FS.Name == "." || FS.Name == "..")) {
          ListArray.Add(FS);
        }
      }
    }
    return ListArray.ToArray();
  }

  //*** End of GetList ***********

  //*************************************************************
  //* Function: ParseFileStructUnixStyle
  //*

  private FileStruct ParseFileStructUnixStyle (string Record) {
    // dr-xr-xr-x   1 owner    group               0 Nov 25  2002 bussys
    FileStruct FS = new FileStruct();
    string ProcStr = Record.Trim();
    if (ProcStr.ToLower() == "total 0") {
      FS.Name = "";
      return FS;
    }
    FS.Flags = ProcStr.Substring(0, 9);
    FS.IsDirectory = (FS.Flags[0] == 'd');
    ProcStr = (ProcStr.Substring(11)).Trim();
    CutSubstr(ref ProcStr, ' ', 0);
    FS.Owner = CutSubstr(ref ProcStr, ' ', 0);
    FS.Group = CutSubstr(ref ProcStr, ' ', 0);
    CutSubstr(ref ProcStr, ' ', 0);
    try {
      FS.CreateTime = DateTime.Parse(CutSubstr(ref ProcStr, ' ', 8));
    }
    catch {
      FS.CreateTime = DateTime.Now;
    }
    if (ProcStr.IndexOf(" ") > 0)
      FS.Name = "\"" + ProcStr + "\"";
    else
      FS.Name = ProcStr;
    return FS;
  }

  //*** End of ParseFileStructUnixStyle ***********

  //*************************************************************
  //* Function: ParseFileStructWindowsStyle
  //*

  private FileStruct ParseFileStructWindowsStyle (string Record) {
    // 02-03-04  07:46PM       <DIR>          Append
    FileStruct FS = new FileStruct();
    string ProcStr = Record.Trim();
    string DateStr = ProcStr.Substring(0, 8);
    ProcStr = (ProcStr.Substring(8, ProcStr.Length - 8)).Trim();
    string TimeStr = ProcStr.Substring(0, 7);
    ProcStr = (ProcStr.Substring(7, ProcStr.Length - 7)).Trim();
    try {
      FS.CreateTime = DateTime.Parse(DateStr + " " + TimeStr);
    }
    catch {
      FS.CreateTime = DateTime.Now;
    }
    if (ProcStr.Substring(0, 5) == "<DIR>") {
      FS.IsDirectory = true;
      ProcStr = (ProcStr.Substring(5, ProcStr.Length - 5)).Trim();
    }
    else {
      string[] StrS = ProcStr.Split(new char[] { ' ' },
        StringSplitOptions.RemoveEmptyEntries);
      // имя файла с пробелами внутри, обрамляем строку двойными кавычками
      if (StrS.Length > 2) {
        ProcStr = "";
        for (int i = 1; i < StrS.Length; i++)
          ProcStr = ProcStr + StrS[i] + " ";
        ProcStr = "\"" + ProcStr.Trim() + "\"";
      }
      else
        ProcStr = StrS[1].Trim();
      FS.IsDirectory = false;
    }
    FS.Name = ProcStr;
    return FS;
  }

  //*** End of ParseFileStructWindowsStyle ***********

  //*************************************************************
  //* Function: GetFileListStyle
  //* Notes:
  //*

  public FileListStyle GetFileListStyle (string[] RecList) {
    foreach (string s in RecList) {
      if (s.Length > 10
          && Regex.IsMatch(s.Substring(0, 10),
            "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)")) {
        return FileListStyle.UnixStyle;
      }
      else if (s.Length > 8
               && Regex.IsMatch(s.Substring(0, 8),
                 "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]")) {
        return FileListStyle.WindowsStyle;
      }
    }
    return FileListStyle.Unknown;
  }

  //*** End of GetFileListStyle ***********

  //*************************************************************
  //* Function: CutSubstr
  //* Notes:
  //*

  private string CutSubstr (ref string s, char c, int startIndex) {
    int pos1 = s.IndexOf(c, startIndex);
    string retString = s.Substring(0, pos1);
    s = (s.Substring(pos1)).Trim();
    return retString;
  }

  //*** End of CutSubstr ***********

  // получить сообщение об ошибке
  public string Err {
    get {
      return this.Error;
    }
  }

}

}

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог