delphi idftp 및 idhttp 컨트롤

IDFTP

1         
procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);
2      
procedure ChangeDir(const ADirName: string);
3    
procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;
4    
procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
5    
procedure Delete(const AFilename: string);


      
if  IdFTP1.Connected  then
begin
...........
end; 

      ,        

                      ,  HTTP              。  FTP                                 ,           。                 ,       ,    FTP         。     WinSocket   FTP    ,   Indy--                。 
       Indy,                  ,       Winsocket    ,   Unix              。  ,                  。
       ,     Indy TIdFtp  。

1.     

       Indy 9  TIdFtp        FTP            。

2.       

(1)      

           ,                               。      RecvBufferSize SendBufferSize     。                TransferType  ,             。

     RecvBufferSize  (    8192  ):        ,                。

     SendBufferSize  (    32768  ):         ,                  。    WriteStream    ,   TStream          。              ,             。

TransferType  (    ftBinary):    TIdFTPTransferType   。              (ftBinary )  ASCII  (ftASCII)。                    、           ;   ASCII                。

(2)       

     OnDisconnected  :TNotifyEvent ,      (disconnect)  。 Disconnect         Socket   ,     。                ,            。

     OnStatus  :TIdStatusEvent 。                 。     DoStatus               。axStatus      TIdStatus ;aaArgs               ,                   。

     OnWork  :OnWord TWorkEvent         。OnWork    DoWork                Indy    。                   。AWorkMode         ,  :wmRead-        ;wmWrite-        。AWorkCount           。

     OnWorkBegin  :TWorkBeginEvent 。            ,     BeginWork      Indy    。                   。AWorkMode         ,  :wmRead-        ;wmWrite-        。AWorkCountMax       OnWorkBegin           ,0     。

     OnWorkEnd  :TWorkEndEvent 。           ,     EndWork      Indy    。AWorkMode         ,  :wmRead-        ;wmWrite-        。AWorkCount        。

      ,                 。      , OnDisconnected            ; OnStatus          ; OnWork                 ;  OnWorkBegin OnWorkEnd                  。

(3)       

                          ,               。     ,     IdFtp        ,  Connected False,                         TCP      ,   :Host(   ):String、Username(   ):String、Password(  ):String,     Port(  )。    Connect         ,              。

    :procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);

       FTP   

  :AAutoLogin: boolean = True

       ,      True。

const ATimeout: Integer = IdTimeoutDefault

    ,  : 。

    :

   if IdFTP1.Connected then try

     if TransferrignData then IdFTP1.Abort;

     IdFTP1.Quit;

   finally

   end

   else with IdFTP1 do try

     Username := UserIDEdit.Text;

     Password := PasswordEdit.Text;

     Host := FtpServerEdit.Text;

     Connect;

     ChangeDir(CurrentDirEdit.Text);

   finally

   end;

(4)    

          ,      FTP       。            ,      ChangeDir(const ADirName: string)       ,ADirName             ,       ChangeDirUp      。

           ,     List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean)                ,      TransferType ftASCII(ASCII  ),  :ADest        ,             。      RetrieveCurrentDir         。

    :

procedure ChangeDir(const ADirName: string);

      

  

const ADirName: string

          

  :          FTP CWD  。

procedure ChangeDirUp;

      

function RetrieveCurrentDir: string;

          

procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);

                  

  :

ADest: TStrings

             

const ASpecifier: string =

    ,           

const ADetails: boolean = true

          

property DirectoryListing: TIdFTPListItems;

            

    :

   LS := TStringList.Create;

   try

     IdFTP1.ChangeDir(DirName);

     IdFTP1.TransferType := ftASCII;

     CurrentDirEdit.Text := IdFTP1.RetrieveCurrentDir;

     DirectoryListBox.Items.Clear;

     IdFTP1.List(LS);

     DirectoryListBox.Items.Assign(LS);

     if DirectoryListBox.Items.Count > 0 then

       if AnsiPos(total, DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);

   finally

     LS.Free;

   end;

(5)     

          ,    DirectoryListing.Items[sCurrFile].ItemType     ,    ditDirectory           ,    ,         。    ,       。    ,             ,            。    Get  ,       。      ,             。

    :

procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;

procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;

           。

    :

const ASourceFile: string

           

const ADestFile: string

           

const ACanOverwrite: boolean = false

      

AResume: Boolean = false

        

    :

       SaveDialog1.FileName := Name;

       if SaveDialog1.Execute then begin

         SetFunctionButtons(false);

         IdFTP1.TransferType := ftBinary;

         BytesToTransfer := IdFTP1.Size(Name);

         if FileExists(Name) then begin

           case MessageDlg(File aready exists. Do you want to resume the download operation?,

             mtConfirmation, mbYesNoCancel, 0) of

             mrYes: begin

               BytesToTransfer := BytesToTransfer - FileSizeByName(Name);

               IdFTP1.Get(Name, SaveDialog1.FileName, false, true);

             end;

             mrNo: begin

               IdFTP1.Get(Name, SaveDialog1.FileName, true);

             end;

             mrCancel: begin

               exit;

             end;

           end;

         end

         else begin

           IdFTP1.Get(Name, SaveDialog1.FileName, false);

         end;

(6)     

               ,  put    。

    :

procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;

procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;

        

    :

const ASourceFile: string

        

const ADestFile: string =

          

const AAppend: boolean = false

      

    :

   if IdFTP1.Connected then begin

     if UploadOpenDialog1.Execute then try

       IdFTP1.TransferType := ftBinary;

       IdFTP1.Put(UploadOpenDialog1.FileName, ExtractFileName(UploadOpenDialog1.FileName));

       //             ;

     finally

       //      

     end;

   end;

(7)     

           Delete  ,          ,         。          RemoveDir  。

    :

procedure Delete(const AFilename: string);

    

procedure RemoveDir(const ADirName: string);

     ,                   。               ,              。

               

    :

   if not IdFTP1.Connected then exit;

   Name := IdFTP1.DirectoryListing.Items[iCurrSelect].FileName;

   if IdFTP1.DirectoryListing.Items[iCurrSelect].ItemType = ditDirectory then try

     idftp1.RemoveDir(Name);

   finally

   end

   else

   try

     idftp1.Delete(Name);

   finally

   end;

(8)     

                   ,            ..   ,              。

(9)     

      IdFtp      ,      abort        。   OnWork               。

    :

//     OnClick  

procedure TMainForm.AbortButtonClick(Sender: TObject);

begin

   AbortTransfer := true;

end;

//IdFTP OnWork    

procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;

   const AWorkCount: Integer);

begin

   ...

   if AbortTransfer then IdFTP1.Abort;

   AbortTransfer := false;

end;

(10)       

                      ,                 ,          ,               。              ,            ,        Get Put        。

                    Size(FileName)。      ,              ,   Get   AResume := True  。      ,  Put AAppend := True    。   

       ,Indy              ,TIdFtp    。                         ,                     。        ,                   。Windows      CreateThread         ,                                 。 Indy             TIdThreadComponent,                  ,      。              TIdThreadCOmponent     
IDHTTP

             ,        ,    HTTP   :
procedure TForm1.HttpDownLoad(aURL, aFile: string; bResume: Boolean);
var
  tStream: TFileStream;
begin //Http    
  if FileExists(aFile) then //        
    tStream := TFileStream.Create(aFile, fmOpenWrite) else
    tStream := TFileStream.Create(aFile, fmCreate);

  if bResume then //    
  begin
    IdHTTP1.Request.ContentRangeStart := tStream.Size - 1;
    tStream.Position := tStream.Size - 1; //         
    IdHTTP1.Head(aURL);
    IdHTTP1.Request.ContentRangeEnd := IdHTTP1.Response.ContentLength;
  end else //       
  begin
    IdHTTP1.Request.ContentRangeStart := 0;
  end;


  try
    IdHTTP1.Get(aURL, tStream); //    
  finally
    tStream.Free;
  end;
end;
        IdHTTP Get  ,   aURL   ,aFile       ,bResume      ,               :
    IdHTTP1.Request.ContentRangeStart := tStream.Size - 1;
    tStream.Position := tStream.Size - 1; //         
    IdHTTP1.Head(aURL);
    IdHTTP1.Request.ContentRangeEnd := IdHTTP1.Response.ContentLength;
                       ,                    ,                   ,       Head         ,                         ,                    -1,      -1                            ,    IdHTTP                                             ,      -1        ,                                。
   FTP       :
procedure TForm1.FtpDownLoad(aURL, aFile: string; bResume: Boolean);
var
  tStream: TFileStream;
  sName, sPass, sHost, sPort, sDir: string;
begin //ftp    
  if FileExists(aFile) then //     
    tStream := TFileStream.Create(aFile, fmOpenWrite) else
    tStream := TFileStream.Create(aFile, fmCreate);

  GetFTPParams(aURL, sName, sPass, sHost, sPort, sDir);
  with IdFTP1 do
  try
    if Connected then Disconnect; //    
    Username := sName;
    Password := sPass;
    Host := sHost;
    Port := StrToInt(sPort);
    Connect;
  except
    exit;
  end;

  IdFTP1.ChangeDir(sDir); //    
  BytesToTransfer := IdFTP1.Size(aFile);
  try
    if bResume then //  
    begin
      tStream.Position := tStream.Size;
      IdFTP1.Get(aFile, tStream, True);
    end else
    begin
      IdFTP1.Get(aFile, tStream, False);
    end;
  finally
    tStream.Free;
  end;
end;
           GetFTPParams()         、  、    、  、         ,IdFTP                 ,    Get()           ,      HTTP       ,  IdFTP Get()       。
            ,             ,        "REST 1"FTP     ,    350     。
                    :
function TForm1.GetProt(aURL: string): Byte;
begin //        http  ftp
  Result := 0;
  if Pos('http', LowerCase(aURL)) = 1 then
    Result := 1; //http  
  if Pos('ftp', LowerCase(aURL)) = 1 then
    Result := 2; //ftp  
end;
                 。
procedure TForm1.MyDownLoad(aURL, aFile: string; bResume: Boolean);
begin
  case GetProt(aURL) of
    0: ShowMessage('       !');
    1: HttpDownLoad(aURL, aFile, bResume);
    2: FtpDownLoad(aURL, aFile, bResume);
  end;
end;
       GetProt()                  。
(2)             ,       ,          :
    :
procedure TForm1.Button1Click(Sender: TObject);
var
  aURL, aFile: string;
begin
  aURL := ComboBox1.Text; //    ,  "http://www.2ccc.com/update/demo.exe";
  aFile := GetURLFileName(aURL); //     ,  "demo.exe"
  if FileExists(aFile) then
  begin
    case MessageDlg('      ,    ?', mtConfirmation, mbYesNoCancel, 0) of
      mrYes: MyDownLoad(aURL, aFile, True); //  
      mrNo: MyDownLoad(aURL, aFile, False); //  
      mrCancel: Exit; //  
    end;
  end else MyDownLoad(aURL, aFile, False); //       
end;
MessageDlg()                、        。
    :
procedure TForm1.Button2Click(Sender: TObject);
begin
  AbortTransfer := True;
end;
      ,          ,AbortTransfer            ,            False,              ,    True   IdHTTP Disconnect IdFTP1 Abort      ,          ,                          ,                           。
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  AbortTransfer := False;
……
end;
 IdHTTP1 IdFTP OnWorkBegin      AbortTransfer   False ,    Work   ,    AbortTransfer            。
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  if AbortTransfer then
  begin //    
    IdHTTP1.Disconnect;
    IdFTP1.Abort;
  end;
  ProgressBar1.Position := AWorkCount;
  Application.ProcessMessages;
end;
(3)              :
 IdHTTP IdFTP OnStatus    :
procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
  ListBox1.ItemIndex := ListBox1.Items.Add(AStatusText);
end;
  IdHTTP IdFTP OnWork、OnStatus              ,              ,              OK 。
 
 8.3.4
3.        ,F9        ,        。
【    】
         IdHTTP IdFTP    ,       Get                       ,            ,              。    ,                  ,        。
【    】
         ,        Indy       ,         URL    TIdURI, IdURI  ,               GetFTPParams()       ,  :
var
  URI: TIdURI;
begin
  URI := TIdURI.Create(aURL); //  
  try
    sProtocol := URI.Protocol; //  
    sHost := URI.Host; //  
    //……       URI     
  finally
    URI.Free;
  end;
end;
                 ,               

좋은 웹페이지 즐겨찾기