Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Список файлов с FTP


Автор: Desperate 7.11.2006, 15:35
Здравствуйте! Не могу получить список файлов с 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

Автор: Matematik 7.11.2006, 15:54
Что возвращает функция FtpFindFirstFile ???

Добавлено @ 15:54 
try except лишне

Автор: Desperate 7.11.2006, 18:26
FtpFindFirstFile аналогична по действию функцие FindFirstFile

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

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

Добавлено @ 19:15 
У тебя нет проверки правильности выполнения FtpFindFirstFile 
если вернет nil то смотри getlasterror

Автор: Desperate 7.11.2006, 20:25
Я этот код взял с одного из вопросов этого форума, как он работает я толком не пойму!

Автор: Quadr0 7.11.2006, 20:31
...

Автор: Desperate 7.11.2006, 23:00
 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/

Автор: crazynetwork 10.1.2011, 01:07
Тоже самое. Как получить список файлов?

Автор: AntonN 11.1.2011, 01:58
послать ему команды:
CWD 
LIST

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

Может у кого то есть нормальный кусок кода на ICS ?

Автор: 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;
/////////////////конец получения информации


Автор: crazynetwork 16.1.2011, 00:05
Цитата(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;
/////////////////конец получения информации


Неужели нельзя это сделать без создания файлов? 

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

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

Добавлено через 27 секунд
А неужели было обязательно цитировать всё моё сообщение? Какой смысл в этом, можно узнать?

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