我用的是indy 10 的tidftp控件,请问如何获得FTP服务器上目录下的所有文件名和子目录,先谢谢了

解决方案 »

  1.   

    这是我做的FTP搜索工具中搜索线程的主要代码,还有不要使用tidftp,长时间搜索会出现死锁现象,使用WinInet单元
    www.ftpff.comprocedure TFtpScan.Execute;
    var
      FFTPHandle: HINTERNET;
      FInetHandle: HINTERNET;
      Enum: HINTERNET;
      FFindFileData: WIN32_FIND_DATA;
      R: Boolean;
      FFileName, DataStr: string;
      TempErrorCode: Cardinal;
    begin
      Sleep(100);
      Application.Initialize;
      FInetHandle := InternetOpen(PChar(ThreadRecord.SiteName), 0, nil, nil, 0);
      FFTPHandle := InternetConnect(FInetHandle, PChar(ThreadRecord.Host), ThreadRecord.Port, PChar(ThreadRecord.UserName), PChar(ThreadRecord.UserPassWord), INTERNET_SERVICE_FTP, 0, 255);
      if (FFTPHandle = nil) and (not Terminated) then
      begin //登陆服务器失败,关闭句柄,记录错误,重新连接
        CloseFTPHandle(FInetHandle, FFTPHandle);
        EnterCriticalSection(CS);
        OnError('InternetConnect', '', GetLastError);
        LeaveCriticalSection(CS);
        ReTryConnection(ThreadRecord);
        Exit;
      end;  while (ThreadRecord.FFTPDir.Count > 0) and (not Terminated) do
      begin
        if (FFTPHandle = nil) or (FInetHandle = nil) then
        begin
          CloseFTPHandle(FInetHandle, FFTPHandle);
          EnterCriticalSection(CS);
          OnError('Handle', '', GetLastError);
          LeaveCriticalSection(CS);
          ReTryConnection(ThreadRecord);
          Exit;
        end;    if FtpSetCurrentDirectory(FFTPHandle, PChar(ThreadRecord.FFTPDir.Strings[0])) = False then
        begin
          EnterCriticalSection(CS);
          OnError('FtpSetCurrentDirectory', ThreadRecord.FFTPDir.Strings[0], GetLastError);
          LeaveCriticalSection(CS);
          ThreadRecord.FFTPDir.Delete(0);
          CloseFTPHandle(FInetHandle, FFTPHandle);
          ReTryConnection(ThreadRecord);
          Exit;
        end;    Enum := FtpFindFirstFile(FFTPHandle, PChar('*.*'), FFindFileData, 0, 0);
        if Enum = nil then
        begin
          TempErrorCode := GetLastError;
          if TempErrorCode <> 18 then
          begin
            EnterCriticalSection(CS);
            OnError('FtpFindFirstFile', ThreadRecord.FFTPDir.Strings[0], TempErrorCode);
            LeaveCriticalSection(CS);
            CloseFTPHandle(FInetHandle, FFTPHandle);
            ReTryConnection(ThreadRecord);
            Exit;
          end;
        end;    R := Enum <> nil;
        while R do
        begin
          FFileName := FFindFileData.cFileName;
          if (FFileName <> '.') and (FFileName <> '..') then
          begin
            if FFindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
            begin
              Inc(ThreadRecord.FileDirCount);
              OnFTPFindDir(ThreadRecord.FFTPDir.Strings[0] + FFileName + '/');
              ThreadRecord.FFTPDir.Add(ThreadRecord.FFTPDir.Strings[0] + FFileName + '/');
            end
            else
            begin
              Inc(ThreadRecord.FileCount);
              DataStr := DataStr + ' | ' + FFileName + ' ' + FileSizeToStr(FFindFileData.nFileSizeLow);
              //OnFTPFindFile(ThreadRecord.FFTPDir.Strings[0], FFileName, FFindFileData.nFileSizeLow);
            end;
          end;
          R := InternetFindNextFile(Enum, @FFindFileData);
        end;
        if DataStr <> '' then
          SaveTOAccess(ThreadRecord.FFTPDir.Strings[0], DataStr);
        DataStr := '';
        InternetCloseHandle(Enum);
        ThreadRecord.FFTPDir.Delete(0);
        Sleep(20);
      end;
      Form1.ListView1.Items.Item[ThreadRecord.FTPThreadNUM].SubItems.Strings[0] := '收集完毕';
      Form1.ListView1.Items.Item[ThreadRecord.FTPThreadNUM].SubItems.Strings[4] := DateTimeToStr(Now);
    end;