Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Работа с FTP - узнать тип элемента


Автор: Сергей Плоткин 21.9.2007, 10:06
Есть такой стандартный код, выводящий в консоль имена файлов и директорий в FTP-каталоге:

Код

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://...");
            request.UsePassive = true;
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

            request.Credentials = new NetworkCredential("ftplogin", "ftppassword");

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            string sDirs = reader.ReadToEnd();

            string[] aDirs = sDirs.Split(new string[] { "\r\n" }, StringSplitOptions.None);

            string sFName;
            for (int i = 0; i < aDirs.Length; i++)
            {
                sFName=aDirs[i];
                Regex RE = new Regex(@"\d{1,2}\:\d{1,2} (.{1,})$");
                if (RE.IsMatch(sFName))
                {
                    sFName = RE.Match(sFName).Groups[1].Value;
                    if (sFName!="." && sFName!="..") Console.WriteLine(sFName);
                }
            }
            reader.Close();
            response.Close();


Насчет RegEx извратился, поскольку опыта в .NET очень мало и, честно говоря, другой способ на ум не пришел для отбрасывания всей ненужной информации, т.е. чтобы оставить только имя без всяких дат и CHMODов. Кстати, может это можно как-то проще сделать?

Вопрос такой: может в .NET есть что-то наподобие коллекции элементов FTP-каталога... Каждый элемент коллекции - класс или структура, содержащий информацию об элементе - имя элемента, тип элемента (файл, папка), права доступа и т.д. и т.п. Так было сделано в библиотеке Indy, входящей в поставку Delphi и билдера, по крайней мере.

Теоретически, используя RegEx, можно, конечно, написать что-то свое, получающее все эти данные, но есть ли в .NET какой-нибудь способ понять - index.ext, к примеру, является файлом или папкой? Просто везде нахожу в качестве примеров работы с FTP либо простенький пример из MSDN, небольшую модификацию которого я и представил (в т.ч. и в MSDN), либо указанния на сторонних производителей. Неужели в .NET нет одновременно простого, но мощного (это ведь главное кредо фреймворка, как я понимаю) решения на эту тему?

Заранее спасибо! Если путался в терминах, прошу прощения - только начинаю изучать.

Автор: CYBERDREAM 22.1.2008, 21:22
Приветствую народ.  smile  Воды утекло порядком, но вот возникла нужда сделать диалог навигации по фтп серваку. Необходимы лишь папки, файлы отображать не стоит  smile 
Использую как основу след. класс http://www.csharphelp.com/archives/archive9.html
Для вывода всех папок и файлов есть метод GetFileList
Код

public string[] getFileList(string mask)
     {

       if(!logined)
       {
         login();
       }

       Socket cSocket = createDataSocket();

       sendCommand("NLST " + mask);

       if(!(retValue == 150 || retValue == 125))
       {
         throw new IOException(reply.Substring(4));
       }

       mes = "";

       while(true)
       {

         int bytes = cSocket.Receive(buffer, buffer.Length, 0);
         mes += ASCII.GetString(buffer, 0, bytes);

         if(bytes < buffer.Length)
         {
           break;
         }
       }

       char[] seperator = {'\n'};
       string[] mess = mes.Split(seperator);

       cSocket.Close();

       readReply();

       if(retValue != 226)
       {
         throw new IOException(reply.Substring(4));
       }
       return mess;
     }

Разумеется выводится все на кучу. С помощью метода GetFileSize пытаюсь вернуть размер файла, в случае ошибки - следует мы имеем папку. Хотелось бы узнать, есть ли более разумное решение? 

Вот собственно сам отбор:
Код

            string[] list;
            ff.chdir("WORK");
            list = ff.getFileList(""); //Получаем весь список файлов и папок
            foreach (string st in list)
            {
                try
                {
                    long lon = ff.getFileSize(st);
                }
                catch                       //Если вылетело исключение, значит имеем папку
                {
                    richTextBox1.Text += st + "\n";
                }

Автор: smartov 23.1.2008, 00:33
Цитата(CYBERDREAM @  22.1.2008,  20:22 Найти цитируемый пост)
есть ли более разумное решение

Можно попробовать chdir smile

Правда мне кажется что есть простой способ получить RAW ответ от сервера. Не знаю как это делается в .NET но уверен что можно.
Там в первой колонке права на файл. 
Код

-rw-rw-rw    user    group    file .....

Директории отличить легко
Код

drw-rw-rw    user    group    mydir .....

Автор: CYBERDREAM 23.1.2008, 09:10
Спасибо smartov. Думаю это самое оно  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)