我做了一个FTP上传 下载  但是当文件相当多的时候  怎么进行查询呢,像在数据库中查询
当我输入文件名称 就可以将文件查询出来,然后下载

解决方案 »

  1.   

       
    {  The   following   function   shows   how   to   connect   to   a   ftp   server   
        and   download   a   file.   
        It   uses   the   functions   from   wininet.dll.       You   need   a   ProgressBar   to   show   the   progress   and   a   Label   to   show   progress   informations.   
    }   uses   
        WinInet,   ComCtrls;   function   FtpDownloadFile(strHost,   strUser,   strPwd:   string;   
        Port:   Integer;   ftpDir,   ftpFile,   TargetFile:   string;   ProgressBar:   TProgressBar):   Boolean;       function   FmtFileSize(Size:   Integer):   string;   
        begin   
            if   Size   > =   $F4240   then   
                Result   :=   Format( '%.2f ',   [Size   /   $F4240])   +   '   Mb '   
            else   
            if   Size   <   1000   then   
                Result   :=   IntToStr(Size)   +   '   bytes '   
            else   
                Result   :=   Format( '%.2f ',   [Size   /   1000])   +   '   Kb ';   
        end;   const   
        READ_BUFFERSIZE   =   4096;     //   or   256,   512,   ...   
    var   
        hNet,   hFTP,   hFile:   HINTERNET;   
        buffer:   array[0..READ_BUFFERSIZE   -   1]   of   Char;   
        bufsize,   dwBytesRead,   fileSize:   DWORD;   
        sRec:   TWin32FindData;   
        strStatus:   string;   
        LocalFile:   file;   
        bSuccess:   Boolean;   
    begin   
        Result   :=   False;       {   Open   an   internet   session   }   
        hNet   :=   InternetOpen( 'Program_Name ',   //   Agent   
                                                    INTERNET_OPEN_TYPE_PRECONFIG,   //   AccessType   
                                                    nil,     //   ProxyName   
                                                    nil,   //   ProxyBypass   
                                                    0);   //   or   INTERNET_FLAG_ASYNC   /   INTERNET_FLAG_OFFLINE       {   
            Agent   contains   the   name   of   the   application   or   
            entity   calling   the   Internet   functions   
        }   
        {   See   if   connection   handle   is   valid   }   
        if   hNet   =   nil   then   
        begin   
            ShowMessage( 'Unable   to   get   access   to   WinInet.Dll ');   
            Exit;   
        end;       {   Connect   to   the   FTP   Server   }   
        hFTP   :=   InternetConnect(hNet,   //   Handle   from   InternetOpen   
                                                        PChar(strHost),   //   FTP   server   
                                                        port,   //   (INTERNET_DEFAULT_FTP_PORT),   
                                                        PChar(StrUser),   //   username   
                                                        PChar(strPwd),     //   password   
                                                        INTERNET_SERVICE_FTP,   //   FTP,   HTTP,   or   Gopher?   
                                                        0,   //   flag:   0   or   INTERNET_FLAG_PASSIVE   
                                                        0);//   User   defined   number   for   callback       if   hFTP   =   nil   then   
        begin   
            InternetCloseHandle(hNet);   
            ShowMessage(Format( 'Host   "%s "   is   not   available ',[strHost]));   
            Exit;   
        end;       {   Change   directory   }   
        bSuccess   :=   FtpSetCurrentDirectory(hFTP,   PChar(ftpDir));       if   not   bSuccess   then   
        begin   
            InternetCloseHandle(hFTP);   
            InternetCloseHandle(hNet);   
            ShowMessage(Format( 'Cannot   set   directory   to   %s. ',[ftpDir]));   
            Exit;   
        end;       {   Read   size   of   file   }   
        if   FtpFindFirstFile(hFTP,   PChar(ftpFile),   sRec,   0,   0)   <>   nil   then   
        begin   
            fileSize   :=   sRec.nFileSizeLow;   //如果你只是找,   不想下載,   到這裹就可了 
            //   fileLastWritetime   :=   sRec.lastWriteTime   
        end   else   
        begin   
            InternetCloseHandle(hFTP);   
            InternetCloseHandle(hNet);   
            ShowMessage(Format( 'Cannot   find   file   ',[ftpFile]));   
            Exit;   
        end;       {   Open   the   file   }   
        hFile   :=   FtpOpenFile(hFTP,   //   Handle   to   the   ftp   session   
                                                  PChar(ftpFile),   //   filename   
                                                  GENERIC_READ,   //   dwAccess   
                                                  FTP_TRANSFER_TYPE_BINARY,   //   dwFlags   
                                                  0);   //   This   is   the   context   used   for   callbacks.       if   hFile   =   nil   then   
        begin   
            InternetCloseHandle(hFTP);   
            InternetCloseHandle(hNet);   
            Exit;   
        end;       {   Create   a   new   local   file   }   
        AssignFile(LocalFile,   TargetFile);   
        {$i-}   
        Rewrite(LocalFile,   1);   
        {$i+}       if   IOResult   <>   0   then   
        begin   
            InternetCloseHandle(hFile);   
            InternetCloseHandle(hFTP);   
            InternetCloseHandle(hNet);   
            Exit;   
        end;       dwBytesRead   :=   0;   
        bufsize   :=   READ_BUFFERSIZE;       while   (bufsize   >   0)   do   
        begin   
            Application.ProcessMessages;           if   not   InternetReadFile(hFile,   
                                                            @buffer,   //   address   of   a   buffer   that   receives   the   data   
                                                            READ_BUFFERSIZE,   //   number   of   bytes   to   read   from   the   file   
                                                            bufsize)   then   Break;   //   receives   the   actual   number   of   bytes   read           if   (bufsize   >   0)   and   (bufsize   <=   READ_BUFFERSIZE)   then   
                BlockWrite(LocalFile,   buffer,   bufsize);   
            dwBytesRead   :=   dwBytesRead   +   bufsize;           {   Show   Progress   }   
            ProgressBar.Position   :=   Round(dwBytesRead   *   100   /   fileSize);   
            Form1.Label1.Caption   :=   Format( '%s   of   %s   /   %d   %% ',[FmtFileSize(dwBytesRead),FmtFileSize(fileSize)   ,ProgressBar.Position]);   
        end;       CloseFile(LocalFile);       InternetCloseHandle(hFile);   
        InternetCloseHandle(hFTP);   
        InternetCloseHandle(hNet);   
        Result   :=   True;   
    end;
      

  2.   

    FtpSetCurrentDirectory(hFTP, PChar(ftpDir)); 
      
    这一句不知道怎么用的,起什么作用?