Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с FTP - узнать тип элемента, Как понять - директория или файл? 
:(
    Опции темы
Сергей Плоткин
Дата 21.9.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.8.2004

Репутация: нет
Всего: нет



Есть такой стандартный код, выводящий в консоль имена файлов и директорий в 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 нет одновременно простого, но мощного (это ведь главное кредо фреймворка, как я понимаю) решения на эту тему?

Заранее спасибо! Если путался в терминах, прошу прощения - только начинаю изучать.
PM MAIL   Вверх
CYBERDREAM
Дата 22.1.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Приветствую народ.  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";
                }


Это сообщение отредактировал(а) CYBERDREAM - 22.1.2008, 21:43


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
smartov
Дата 23.1.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



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

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

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

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

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

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

PM MAIL   Вверх
CYBERDREAM
Дата 23.1.2008, 09:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Спасибо smartov. Думаю это самое оно  smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.