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


Автор: AndreyZ53 30.3.2016, 15:39
Здравствуйте! Перерыл весь Интернет, ничего толького не нашел. Суть задачи - организовать поиск по всему фтп. То есть, на фтп есть папка SDO, и в ней найти все файлы, со всеми расширениями, но сложность задачи состоит в том, что структура может доходить до такой:

/SDO/41/246000/KTA4634/IN/

И таких папок множество на фтп, нужно залезть в каждую и там найти файлы и вывести их в список.

Нашел на форумах вроде бы как работающие примеры, например вот:

Код

uses
 WinInet;

procedure TForm27.Button1Click(Sender: TObject);

 procedure FindFTPFiles(FConnect: HINTERNET; Dir: String);
 var
   hFileConnection: HINTERNET;
   FindData: TWin32FindData;
   SubDirs: TStringList;
   I: Integer;
 begin
   SubDirs := TStringList.Create;
   try
     FtpSetCurrentDirectory(FConnect, PChar(Dir));
     hFileConnection := FtpFindFirstFile(FConnect, pChar("*.*"), FindData,
       INTERNET_FLAG_NEED_FILE , 0);
     if hFileConnection <> nil then
     try
       ZeroMemory(@FindData, SizeOf(TWin32FindData));

       while InternetFindNextFile(hFileConnection, @FindData) do
       begin
         if
           (StrPas(FindData.cFileName) = ".") or
           (StrPas(FindData.cFileName) = "..") then
           Continue;

         if FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
         begin
           SubDirs.Add(Dir + String(FindData.cFileName) + "/");
           Memo1.Lines.Add(Dir + String(FindData.cFileName) + "/");
         end
         else
           Memo1.Lines.Add(Dir + String(FindData.cFileName));

         Application.ProcessMessages;
         //if Memo1.Lines.Count > 100 then Break;
       end;

     finally
       InternetCloseHandle(hFileConnection);
     end;

     for I := 0 to SubDirs.Count - 1 do
       FindFTPFiles(FConnect, SubDirs.Strings[I]);

   finally
     SubDirs.Free;
   end;
 end;

var
 FSession, FConnect: HINTERNET;
 FHost: String;

begin
 FHost := "ftp.synclub.ru";
 FSession := InternetOpen("", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if not Assigned(FSession) then Exit;
 try
   FConnect := InternetConnect(FSession, PChar(FHost),
     INTERNET_DEFAULT_FTP_PORT, PChar("synclub"),
     PChar("synclub"), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
   if not Assigned(FConnect) then Exit;
   try
     FindFTPFiles(FConnect, "/jazz/3rd Force/");
     Memo1.Lines.Add("=====================================");
     Memo1.Lines.Add("All done");
   finally
     InternetCloseHandle(FConnect);
   end;
 finally
   InternetCloseHandle(FSession);
 end;
end;


Но он не подходит, он не может дойти до последний папки, максимум заходит на три уровня, то есть до сюда /SDO/41/246000/ и то не во все папки, не могу вообще понять смысл, почему так.

Пробовал и Synapse и idFTP, особо ничего по этому вопросу так и не нашел. Кто делал что-то подобное, поделитесь пожалуйста опытом!

Автор: magnet 31.3.2016, 14:13
Данному вопросу лет уже больше чем тебе. Надеюсь, что ЯП не принципиален?
http://forum.vingrad.ru/index.php?showtopic=251108&view=findpost&p=1810834
ну и ядекс в помощь https://yandex.ru/search/?text=ftp рекурсивный поиск

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Poisk-vsekh-faylov-na-FTP-id56fbc99eae2015ac598b4567#findElement_E7045_56fd0657ae2015a05c8b46c3_0

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