Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список файлов с FTP, получение списка файлов с FTP-сервера 
:(
    Опции темы
Desperate
Дата 7.11.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! Не могу получить список файлов с FTP-сервера! 
адресс выглядет так ....ru/dir - корневой каталог, в нем лежат папки Music, Soft, Video и т.д.
никаких логинов и паролей не требует, свободный доступ через IE. 
Нужно сделать список всех файлов например в директории Music включая все подкаталоги и вывести его с полным путем в ListBox! Можно примерчик, а то с сетями не работал никогда!
Я пробывал такой вариант
Код

var
FtpHandle,InetHandle, hFind: HInternet;
s:WIN32_FIND_DATA;

procedure TForm1.Button2Click(Sender: TObject);
begin
InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
FtpHandle := InternetConnect(InetHandle, PChar('198.10.11.3'), 21, PChar('Anonymous'),
PChar('....ru/dir/Music'), INTERNET_SERVICE_FTP, 0, 255);
if not Assigned(FtpHandle) then
InternetCloseHandle(InetHandle)
else

try
hFind:= FtpFindFirstFile(FtpHandle, PChar('*.*'), s, FTP_TRANSFER_TYPE_BINARY, 
255);
except
exit;
end;
ListBox1.Items.Add(s.cFileName + ' | ' + intToStr(s.dwFileAttributes));
while InternetFindNextFile(hFind, @s) do
begin
ListBox1.Items.Add(s.cFileName + ' | ' + intToStr(s.dwFileAttributes))
end;
InternetCloseHandle(InetHandle);
end;


но вы ListBox выдает только 0| и все

В чем тут ошибка или может другой вариант кто подскажет(код)!
Спасибо!

Добавлено @ 15:37 
адресс ftp://....ru/dir
PM MAIL   Вверх
Matematik
Дата 7.11.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Что возвращает функция FtpFindFirstFile ???

Добавлено @ 15:54 
try except лишне
PM MAIL WWW ICQ   Вверх
Desperate
Дата 7.11.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



FtpFindFirstFile аналогична по действию функцие FindFirstFile
PM MAIL   Вверх
Matematik
Дата 7.11.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Desperate @  7.11.2006,  18:26 Найти цитируемый пост)
FtpFindFirstFile аналогична по действию функцие FindFirstFile 

Это я знаю.
ты на вопрос не ответил

Добавлено @ 19:15 
У тебя нет проверки правильности выполнения FtpFindFirstFile 
если вернет nil то смотри getlasterror
PM MAIL WWW ICQ   Вверх
Desperate
Дата 7.11.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я этот код взял с одного из вопросов этого форума, как он работает я толком не пойму!
PM MAIL   Вверх
Quadr0
Дата 7.11.2006, 20:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 13:20
  Вверх
Desperate
Дата 7.11.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile Выдает только pub|16 и то если адресс либо IP
Код

FtpHandle := InternetConnect(InetHandle, '62.183.39.178',
    INTERNET_DEFAULT_FTP_PORT, nil, nil, INTERNET_SERVICE_FTP,
      INTERNET_FLAG_NO_AUTH, 0);

либо 
Код

FtpHandle := InternetConnect(InetHandle, 'clon.mediazona.ru',
    INTERNET_DEFAULT_FTP_PORT, nil, nil, INTERNET_SERVICE_FTP,
      INTERNET_FLAG_NO_AUTH, 0);


а мне нужна целевая папка ftp://clon.mediazona.ru/pub/MUSIC/
PM MAIL   Вверх
crazynetwork
Дата 10.1.2011, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тоже самое. Как получить список файлов?
PM MAIL   Вверх
AntonN
Дата 11.1.2011, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



послать ему команды:
CWD 
LIST



--------------------
user posted image
PM MAIL WWW   Вверх
crazynetwork
Дата 11.1.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(AntonN @ 11.1.2011,  01:58)
послать ему команды:
CWD 
LIST

Может у кого то есть нормальный кусок кода на ICS ?
PM MAIL   Вверх
Akella
Дата 13.1.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Разбирайся:

Код



    if FtpClient1.Connected then FtpClient1.Quit;

    LogUpdate(constSetConnectParams);
    FtpClient1.HostName := Ftp_Address;
    FtpClient1.Port     := IntToStr(Ftp_Port);
    FtpClient1.Username := dbeSetName.Text;
    FtpClient1.Password := dbeSetPassword.Text;

    FtpClient1.Passive := USEPASSIVE_BOOLEAN;

    case rgTransferMode.ItemIndex of
      0: FtpClient1.Binary := false;
      1: FtpClient1.Binary := true;
    end;

    //кодировка. По умолчанию UTF8 OFF
    FtpClient1.NewOpts := comboboxOpts.Text;


  case ansiindextext(comboboxOpts.Text, ['UTF8 ON', 'UTF8 OFF']) of
    0:FtpClient1.CodePage := CP_UTF8;
    1:FtpClient1.CodePage := CP_ACP;
  else
    FtpClient1.CodePage := 0;
  end;//case


    try
      LogUpdate(constConnectingTo + FtpClient1.HostName + ':' + FtpClient1.Port);
      FtpClient1.UserName := dbeSetName.Text;
      FtpClient1.PassWord := dbeSetPassword.Text;

      Result := FtpClient1.Connect;
      LogUpdate(FtpClient1.LastResponse);
      FtpClient1.Opts;//указываем серверу нужную кодировку

      if not result then
        begin
          LogUpdate(constErrorConnectingTo);
          LogUpdate(constError + '! ' + FtpClient1.ErrorMessage);
          LogUpdate(FtpClient1.LastResponse);
        end;
    except
      on e: Exception do begin
        LogUpdate(constErrorExceptionConnectingTo);
        LogUpdate(constError + '! ' + FtpClient1.ErrorMessage);
        LogUpdate(constError + '! ' + e.Message, true, true);
        LogUpdate(FtpClient1.LastResponse);
      end;//exception
    end;



////////////////////////////////////////////////////////////////////////////////
///  получение информации
////////////////////////////////////////////////////////////////////////////////
    if FtpClient1.Connected then
    begin
//      FtpClient1.TypeAscii;

          Application.ProcessMessages;
          LogUpdate(constLogMsgTryChangeDirToOut);

          FtpClient1.DisplayFileFlag := true;

          //смена каталога
          FtpClient1.HostDirName := '/out';
          FtpClient1.Cwd;

          if FtpClient1.Dir then
            begin
              slData.Clear;
              FtpClient1.Pwd;
              LogUpdate(constLogMsgWorkingDir +  FtpClient1.DirResult);


              //получаем список файлов

              //чистим список перед получением в него списка фтп-файлов
              slData.Clear;

              //удаляем файл со старым списком
//last_ftp_list содержит имя служебного файла, в этот файл загружается список
              if FileExists(sMyDocAppPath + last_ftp_list) then
                DeleteFile(sMyDocAppPath + last_ftp_list);

              FtpClient1.LocalFileName := sMyDocAppPath + last_ftp_list;

              FtpClient1.DisplayFileFlag := false;

              if not FtpClient1.Ls then
                LogUpdate(FtpClient1.ErrorMessage);


              slData.LoadFromFile(sMyDocAppPath + last_ftp_list);

              FtpClient1.DisplayFileFlag := false;
            end;


          LogUpdate(constLogMsgFilesFound + intToStr(slData.Count));

          for h := 0 to slData.Count - 1 do
            begin
              Application.ProcessMessages;
              if (slData[h] = '.') or
                 (slData[h] = '..') or
                 (AnsiUpperCase(slData[h]) = '/OUT')
              then
                continue;

              //в какую папку и какой файл скачиваем
              FtpClient1.LocalFileName := fmMain.sInFolder + slData[h];

              FtpClient1.HostFileName := slData[h];

              //получаем размер файла

              if FtpClient1.Size then
                begin
                  S := FormatFloat(' 0.00 Kb', (FtpClient1.SizeResult / 1024));
                  LogUpdate(constLogMsgFileSize + s);
                end
              else
                LogUpdate(constError +': ' + FtpClient1.ErrorMessage);


              LogUpdate(constLogMsgRecivingFile + FtpClient1.HostDirName + '/' + FtpClient1.HostFileName);

              //5 попыток
              for iTryCount := 1 to 5 do begin
                LogUpdate(constLogMsgWaitWhileDownload + IntToStr(iTryCount));

                //удаляем локальный файл с диска
                if FileExists(FtpClient1.LocalFileName) then
                  if not DeleteFile(FtpClient1.LocalFileName) then
                    LogUpdate(constLogMsgCannotDeleteLocalFile + FtpClient1.LocalFileName);

                ProgressBar1.Max := FtpClient1.SizeResult;

                FtpClient1.TypeBinary;
                FtpClient1.DisplayFileFlag := false;

                //пытаемся забрать файл с ftp-сервера
                if not FtpClient1.get then
                  LogUpdate(constLogMsgCannotDownloadFile + FtpClient1.HostDirName + '/' + FtpClient1.HostFileName);

                FtpClient1.TypeAscii;

                //добавить проверку, поддерживает ли фтп-сервер CRC32
                if cbCRC.Checked then
                  begin
                    //узнаём CRC удалённого файла
                    if FtpClient1.XCrc then
                      begin
                        iCRC := StrToInt('$' + FtpClient1.CrcResult);
                        LogUpdate('CRC32: '+FtpClient1.CrcResult);
                        //если CRC совпадают, то прекращаем пытаться скачть ещё раз этот файл
                        if iCrc = FileCRC32(FtpClient1.LocalFileName) then
                          begin
                            LogUpdate(constLogMsgSuccessfull);
                            //удаляем с ftp сервера в случае удачного скачивания
                            if cbDeleteFromFTP.Checked then
                              FtpClient1.Dele;
                            Break;
                          end//if iCrc =
                       else
                         LogUpdate(constLogMsgErrorRecivingFile + FtpClient1.HostDirName + FtpClient1.HostFileName);
                      end//if FtpClient1.XCrc then
                    else//if FtpClient1.XCrc then
                      LogUpdate(constError + ': ' + FtpClient1.ErrorMessage);
                  end//if cbCRC.Checked then
                else
                  begin
                    //если не включена проверка CRC
                    if cbDeleteFromFTP.Checked then
                      FtpClient1.Dele;
                    Break;
                  end;

              end;//for iTryCount := 1 to 5 do begin
            end;//for h := 0 to slData.Count - 1 do
      end
    else
      begin
        LogUpdate(constLogMsgErrorConnectingToFTP);//if IdFTP.Connected then
        LogUpdate(FtpClient1.ErrorMessage);
      end;
/////////////////конец получения информации


PM MAIL   Вверх
crazynetwork
Дата 16.1.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Akella @ 13.1.2011,  11:14)
Разбирайся:

Код



    if FtpClient1.Connected then FtpClient1.Quit;

    LogUpdate(constSetConnectParams);
    FtpClient1.HostName := Ftp_Address;
    FtpClient1.Port     := IntToStr(Ftp_Port);
    FtpClient1.Username := dbeSetName.Text;
    FtpClient1.Password := dbeSetPassword.Text;

    FtpClient1.Passive := USEPASSIVE_BOOLEAN;

    case rgTransferMode.ItemIndex of
      0: FtpClient1.Binary := false;
      1: FtpClient1.Binary := true;
    end;

    //кодировка. По умолчанию UTF8 OFF
    FtpClient1.NewOpts := comboboxOpts.Text;


  case ansiindextext(comboboxOpts.Text, ['UTF8 ON', 'UTF8 OFF']) of
    0:FtpClient1.CodePage := CP_UTF8;
    1:FtpClient1.CodePage := CP_ACP;
  else
    FtpClient1.CodePage := 0;
  end;//case


    try
      LogUpdate(constConnectingTo + FtpClient1.HostName + ':' + FtpClient1.Port);
      FtpClient1.UserName := dbeSetName.Text;
      FtpClient1.PassWord := dbeSetPassword.Text;

      Result := FtpClient1.Connect;
      LogUpdate(FtpClient1.LastResponse);
      FtpClient1.Opts;//указываем серверу нужную кодировку

      if not result then
        begin
          LogUpdate(constErrorConnectingTo);
          LogUpdate(constError + '! ' + FtpClient1.ErrorMessage);
          LogUpdate(FtpClient1.LastResponse);
        end;
    except
      on e: Exception do begin
        LogUpdate(constErrorExceptionConnectingTo);
        LogUpdate(constError + '! ' + FtpClient1.ErrorMessage);
        LogUpdate(constError + '! ' + e.Message, true, true);
        LogUpdate(FtpClient1.LastResponse);
      end;//exception
    end;



////////////////////////////////////////////////////////////////////////////////
///  получение информации
////////////////////////////////////////////////////////////////////////////////
    if FtpClient1.Connected then
    begin
//      FtpClient1.TypeAscii;

          Application.ProcessMessages;
          LogUpdate(constLogMsgTryChangeDirToOut);

          FtpClient1.DisplayFileFlag := true;

          //смена каталога
          FtpClient1.HostDirName := '/out';
          FtpClient1.Cwd;

          if FtpClient1.Dir then
            begin
              slData.Clear;
              FtpClient1.Pwd;
              LogUpdate(constLogMsgWorkingDir +  FtpClient1.DirResult);


              //получаем список файлов

              //чистим список перед получением в него списка фтп-файлов
              slData.Clear;

              //удаляем файл со старым списком
//last_ftp_list содержит имя служебного файла, в этот файл загружается список
              if FileExists(sMyDocAppPath + last_ftp_list) then
                DeleteFile(sMyDocAppPath + last_ftp_list);

              FtpClient1.LocalFileName := sMyDocAppPath + last_ftp_list;

              FtpClient1.DisplayFileFlag := false;

              if not FtpClient1.Ls then
                LogUpdate(FtpClient1.ErrorMessage);


              slData.LoadFromFile(sMyDocAppPath + last_ftp_list);

              FtpClient1.DisplayFileFlag := false;
            end;


          LogUpdate(constLogMsgFilesFound + intToStr(slData.Count));

          for h := 0 to slData.Count - 1 do
            begin
              Application.ProcessMessages;
              if (slData[h] = '.') or
                 (slData[h] = '..') or
                 (AnsiUpperCase(slData[h]) = '/OUT')
              then
                continue;

              //в какую папку и какой файл скачиваем
              FtpClient1.LocalFileName := fmMain.sInFolder + slData[h];

              FtpClient1.HostFileName := slData[h];

              //получаем размер файла

              if FtpClient1.Size then
                begin
                  S := FormatFloat(' 0.00 Kb', (FtpClient1.SizeResult / 1024));
                  LogUpdate(constLogMsgFileSize + s);
                end
              else
                LogUpdate(constError +': ' + FtpClient1.ErrorMessage);


              LogUpdate(constLogMsgRecivingFile + FtpClient1.HostDirName + '/' + FtpClient1.HostFileName);

              //5 попыток
              for iTryCount := 1 to 5 do begin
                LogUpdate(constLogMsgWaitWhileDownload + IntToStr(iTryCount));

                //удаляем локальный файл с диска
                if FileExists(FtpClient1.LocalFileName) then
                  if not DeleteFile(FtpClient1.LocalFileName) then
                    LogUpdate(constLogMsgCannotDeleteLocalFile + FtpClient1.LocalFileName);

                ProgressBar1.Max := FtpClient1.SizeResult;

                FtpClient1.TypeBinary;
                FtpClient1.DisplayFileFlag := false;

                //пытаемся забрать файл с ftp-сервера
                if not FtpClient1.get then
                  LogUpdate(constLogMsgCannotDownloadFile + FtpClient1.HostDirName + '/' + FtpClient1.HostFileName);

                FtpClient1.TypeAscii;

                //добавить проверку, поддерживает ли фтп-сервер CRC32
                if cbCRC.Checked then
                  begin
                    //узнаём CRC удалённого файла
                    if FtpClient1.XCrc then
                      begin
                        iCRC := StrToInt('$' + FtpClient1.CrcResult);
                        LogUpdate('CRC32: '+FtpClient1.CrcResult);
                        //если CRC совпадают, то прекращаем пытаться скачть ещё раз этот файл
                        if iCrc = FileCRC32(FtpClient1.LocalFileName) then
                          begin
                            LogUpdate(constLogMsgSuccessfull);
                            //удаляем с ftp сервера в случае удачного скачивания
                            if cbDeleteFromFTP.Checked then
                              FtpClient1.Dele;
                            Break;
                          end//if iCrc =
                       else
                         LogUpdate(constLogMsgErrorRecivingFile + FtpClient1.HostDirName + FtpClient1.HostFileName);
                      end//if FtpClient1.XCrc then
                    else//if FtpClient1.XCrc then
                      LogUpdate(constError + ': ' + FtpClient1.ErrorMessage);
                  end//if cbCRC.Checked then
                else
                  begin
                    //если не включена проверка CRC
                    if cbDeleteFromFTP.Checked then
                      FtpClient1.Dele;
                    Break;
                  end;

              end;//for iTryCount := 1 to 5 do begin
            end;//for h := 0 to slData.Count - 1 do
      end
    else
      begin
        LogUpdate(constLogMsgErrorConnectingToFTP);//if IdFTP.Connected then
        LogUpdate(FtpClient1.ErrorMessage);
      end;
/////////////////конец получения информации


Неужели нельзя это сделать без создания файлов? 
PM MAIL   Вверх
Akella
Дата 18.1.2011, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(crazynetwork @  16.1.2011,  00:05 Найти цитируемый пост)
Неужели нельзя это сделать без создания файлов?

Может и можно, читай документацию.

Добавлено через 27 секунд
А неужели было обязательно цитировать всё моё сообщение? Какой смысл в этом, можно узнать?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

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

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


 




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


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

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