Delphi IdFTP[1] 使用介紹


Delphi IdFTP[1] 使用介紹
1、屬性:

  • Host:  //FTP服務器地址。
  • USER://用戶帳號。
  • Password:  //密碼。
  • Passive: //用於控制FTP數據連接方法。FTP的數據傳輸可以有主動和被動。Port:  //FTP服務的默認端口是21。
    •   PORT是主動模式,在建立數據通道時,服務端去連接別人;
    •   PASV是被動模式,在建立數據通道時,服務端被別人連接;
      • 建立數據通道時,用PORT模式還是PASV模式,選擇權在於FTP客戶端。
      • IDFTP里的passive是一個Boolean數據類型。當True時為主動;當false時為被動。
  • TransferType:  //傳輸文件的類型,可以取值為FtBinary(8位的任意文件)和FtAscii(7位的文本文件)。
  • SystemDesc:  //FTP服務器的描述。


2、常用方法

  • Connect:  //連接FTP服務器.
  • Abort:  //停止FTP服務的操作。
  • Quit:  //關閉客戶端與服務器的連接.
  • Noop:  //用於保持連接的命令,防止被服務器關掉連接.
  • List:  //獲取FTP服務器上的文件和目錄列表.
    • 原型為: procedure List(ADest:TStrings;Const ASpecifier:String;const ADetails:Boolean);
  • RetrieveCurrentDir: //取得當前目錄的名稱.
  • Site:  //發送FTP服務器的命令.
    •   原型為:procedure Site(const ACommand:string);
  • ChangeDir:  //改變FTP服務器上的當前目錄ChangeDirUp: //將FTP服務器上的目錄返回到你目錄.
    •   原型為: procedure ChangeDir(const ADirName:string);
  • MakeDir: //在服務器上建立一個新目錄.
    •   原型為:procedure MakeDir(const ADirName:String);
  • RemoveDir:  //刪除服務器上的一個目錄.Get:  //從FTP服務器上下載文件.這個方法被重載了.  // 所謂“重載”,就是當從多個“類”身上繼承一些方法時,會發生沖突。為了避免這一個沖突,就使用了“重載”功能
    •   原型為:procedure RemoveDir(const ADirName:string);
  • Get:  //從FTP服務器上下載文件.這個方法被重載了.
    •   原型為:procedure Get(const ASourceFile:string;ADest:TStream);overload;
    •   procedure Get(const ASourceFile:string;const ADest:string;ACanOverWrite:Boolean);overload;
  • Put:  //用於向服務器上傳文件.該方法被重載.KillDataChannal:  //關閉FTP數據通道.
    •   原型為:procedure Put(const ASourceFile:TStream;const ADest:string;const Appand:Boolean);overload;
    •   procedure Put(const ASourceFile:string;const ADest:string;const AAppand:Boolean);overload;
  • Delete:  //刪除FTP服務器上一個文件.
    •   原形為:procedure Delete(const AfileName:string);
  • Rename:  //更改服務器上的文件名.
    •   原型為:procedure Rename(const ASourceFile:string;const ADestFile:string);
  • Size:  //獲取文件大小信息.
    •   原型為:function Size(const AFileName:string):Integer;
  • Delete:  //刪除FTP服務器上一個文件.
    •   原形為:procedure Delete(const AfileName:string);

 

3、代碼示例:
//3.1連接

with idftp do begin
  try
    Host := trim(edit1.Text); //FTP服務器IP地址
    Username := trim(edit2.Text); //用戶名
    Password := trim(edit3.Text); //密碼
    Connect; // 連接
    DirectoryListBox.Items.Clear; // 清空目錄以及文件信息
    DebugListBox.Items.Clear; // 清空記錄信息
// SaveFTPHostInfo(trim(CURDIR.Text), 'FTPHOST');
  finally
    if Connected then
    begin
      DisplayDir(trim(CURDIR.Text)); // 改變當前路徑
      FTPCon.Enabled := false; // 連接按鈕
      FTPDisCon.Enabled := True; // 斷開按鈕
    end;
  end;
end;

 

//3.2斷開按鈕的代碼:

try
  if IdFTP.Connected then // 判斷客戶端是否連着服務器
    IdFTP.Abort;
  if TransferrignData then // 判斷客戶端與服務器之間是否有數據傳輸
    IdFTP.Quit;
finally
  IdFTP.Disconnect; // 斷開連接
  FTPCon.Enabled := true;
  FTPDisCon.Enabled := false;
end;

 

//3.3TransferrignData 全局變量定義,連接按鈕DisplayDir過程: 

procedure TFFTPClient.DisplayDir(DirName: string);
var
  LS: TStringList;
begin
  LS := TStringList.Create;
  try
    IdFTP.ChangeDir(DirName);
    IdFTP.TransferType := ftASCII; // 編譯不通過時 USES IdFTPCommon
    CURDIR.Text := IdFTP.RetrieveCurrentDir;
    DirectoryListBox.Items.Clear;
    IdFTP.List(LS); // 把IDFTP里的LIST與LS關聯起來
    DirectoryListBox.Items.Assign(LS); // 把DIRECTORYLISTBOX 與 LS 關聯起來
    if DirectoryListBox.Items.Count > 0 then
      if AnsiPos('total', DirectoryListBox.Items[0]) > 0 then
        DirectoryListBox.Items.Delete(0);
  finally
    LS.Free;
  end;
end;

  

//3.4  顯示目錄(把LISTBOX的STYLE的屬性改成lbOwnerDrawFixed,再在ONDRAWITEM方法里添 )

procedure TFFTPClient.DirectoryListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  R: TRect;
begin
//---------------------------------當選擇一條記錄時
  if odSelected in State then
  begin
    DirectoryListBox.Canvas.Brush.Color := $00895F0A;
    DirectoryListBox.Canvas.Font.Color := clWhite;
  end
  else
  begin
    DirectoryListBox.Canvas.Brush.Color := clWindow;
  end;
//---------------------------------顯示當前目錄里的信息
  if Assigned(IdFTP.DirectoryListing) and (IdFTP.DirectoryListing.Count > Index) then
  begin
    DirectoryListBox.Canvas.FillRect(Rect);
    with IdFTP.DirectoryListing.Items[Index] do
    begin
//------------------------//
      DirectoryListBox.Canvas.TextOut(Rect.Left, Rect.Top, FileName); // 文件名
      R := Rect;
      R.Left := Rect.Left + HeaderControl1.Sections.Items[0].Width;
//------------------------//
      R.Right := R.Left + HeaderControl1.Sections.Items[1].Width;
      DirectoryListBox.Canvas.FillRect(R);
      DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, IntToStr(Size)); // 文件大小
//------------------------//
      R.Left := R.Right;
      R.Right := R.Left + HeaderControl1.Sections.Items[2].Width;
      DirectoryListBox.Canvas.FillRect(R);
      if ItemType = ditDirectory then // 是文件夾類型 編譯不通過時要USES IDFTPLIST
      begin
        DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, '文件夾');
      end
      else
      begin
        DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, '文件');
      end;
//------------------------//
      R.Left := R.Right;
      R.Right := R.Left + HeaderControl1.Sections.Items[3].Width;
      DirectoryListBox.Canvas.FillRect(R);
      DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, FormatDateTime('yyyy-mm-dd hh:mm', ModifiedDate)); // 修改時間
//------------------------//
      R.Left := R.Right;
      R.Right := R.Left + HeaderControl1.Sections.Items[4].Width;
      DirectoryListBox.Canvas.FillRect(R);
      DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, GroupName); // 組名
//------------------------//
      R.Left := R.Right;
      R.Right := R.Left + HeaderControl1.Sections.Items[5].Width;
      DirectoryListBox.Canvas.FillRect(R);
      DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, OwnerName); // 擁有者名字
//------------------------//
      R.Left := R.Right;
      R.Right := R.Left + HeaderControl1.Sections.Items[6].Width;
      DirectoryListBox.Canvas.FillRect(R);
      DirectoryListBox.Canvas.TextOut(R.Left, Rect.Top, OwnerPermissions + GroupPermissions + UserPermissions); // 權限
    end;
  end;
end;

提示:可以通過IDFTP里的work,status,workbegin,workend來實現進度條
//3.5 上傳代碼示例:

if IdFTP.Connected then
begin
  if OpenDialog1.Execute then
  try
    IdFTP.TransferType := ftBinary;
    IdFTP.Put(OpenDialog1.FileName, ExtractFileName(OpenDialog1.FileName));
  finally
    DisplayDir(idftp.RetrieveCurrentDir);
  end;
end;

//3.6 下載代碼示例: 

procedure TFFTPClient.DirectoryListBoxDblClick(Sender: TObject);
var
  FName: string;
begin
  if not IdFTP.Connected then // 判斷FTP是否還連着服務器
    exit;
  FName := IdFTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
  if IdFTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory then // 假如雙擊是文件夾,就改變路徑
  begin
    CURDIR.Text := Trim(FName);
    DisplayDir(CURDIR.Text);
  end
  else
  begin
    try
      SaveDialog1.FileName := Name; // 得到保存的文件名
      if SaveDialog1.Execute then
      begin
        IdFTP.TransferType := ftBinary; // 以二進制進行傳輸
        BytesToTransfer := IdFTP.Size(Name); // 得到文件的大小
        if FileExists(Name) then
        begin
          case MessageDlg('文件已經存在,是否重新下載?', mtConfirmation, mbYesNoCancel, 0) of
            mrYes:
              begin
                BytesToTransfer := BytesToTransfer - FileSizeByName(Name); // FileSizeByName在IdGlobal
                IdFTP.Get(Name, SaveDialog1.FileName, false, true);
              end;
            mrNo:
              begin
                IdFTP.Get(Name, SaveDialog1.FileName, true);
              end;
            mrCancel:
              begin
                exit;
              end;
          end;
        end
        else
        begin
          IdFTP.Get(Name, SaveDialog1.FileName, false);
        end;
      end;
    finally
    end;
  end;
end;

  

// 3.7 新建目錄:

var
  DirName:string;
begin
  DirName:=InputBox('輸入新目錄名稱', '提示信息', '');
  if DirName <> '' then
  try
    IdFTP.MakeDir(DirName);
    DisplayDir(CURDIR.Text);
  finally
  end;
end;

  

 

 

創建時間:2020.05.08  更新時間:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM