在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Delphi IdFTP[2] 常用过程、事件、方法介绍 1、属性
2、事件
3、过程、方法(Connext、ChangeDir、List、Get、Put) 3.1 连接 procedure Connect(AAutoLogin: boolean; const ATimeout: Integer); //连接远程FTP服务器 属性:
示例代码: 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;
3.2 改变目录 procedure ChangeDir(const ADirName: string); //改变工作目录 属性
procedure ChangeDirUp; //到上一级目录 也可以用 ,IdFTP1.ChangeDir('..'); //返回上一级目录 function RetrieveCurrentDir: string; //该函数返回当前目录名
3.3 列表(目录、文件、属性) procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean); //列出当前目录所有文件和子目录及其属性 参数:
相对属性: 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;
也可以这样用(补充 2020.06.16): IdFTP1.List(nil); //获取当前目录的所有信息 //或者 IdFTP1.List(DirList); //这个会得到列表的所有信息,包含时间、大小、类型等,相当于 IdFTP1.List(DirList,'',true); //或者 IdFTP1.List(DirList,'',False); //得到FTP路径下的所有文件夹名称 给到 DirList ,false只获取目录名称 ,这种方式获取的数据不包含数据类型的判断 //或者 IdFTP1.List; //支持Delphi XE 版本 //或者 IdFTP1.List('',False); //支持Delphi XE 版本 //看源代码: procedure TIdFTP.List; begin List(nil); end; procedure TIdFTP.List(const ASpecifier: string; ADetails: Boolean); begin List(nil, ASpecifier, ADetails); end; procedure TIdFTP.List(ADest: TStrings; const ASpecifier: string = ''; ADetails: Boolean = True); {do not localize} var LDest: TMemoryStream; LTrans : TIdFTPTransferType; begin if ADetails and UseMLIS and FCanUseMLS then begin ExtListDir(ADest, ASpecifier); Exit; end; // Note that for LIST, it might be best to put the connection in ASCII mode. because some old servers such as TOPS20 might require this. We restore it if the original mode was not ASCII. // It's a good idea to do this anyway because some clients still do this such as WS_FTP Pro and Microsoft's FTP Client. {注意,对于LIST,最好将连接设置为ASCII模式。因为像top20这样的旧服务器可能需要这个。如果原始模式不是ASCII,我们将恢复它。无论如何,这样做是一个好的方式,因为有些客户机仍然这样做,如WS_FTP Pro和微软的FTP客户机。} LTrans := TransferType; if LTrans <> ftASCII then begin Self.TransferType := ftASCII; end; try LDest := TMemoryStream.Create; try InternalGet(Trim(iif(ADetails, 'LIST', 'NLST') + ' ' + ASpecifier), LDest); {do not localize} FreeAndNil(FDirectoryListing); FDirFormat := ''; LDest.Position := 0; FListResult.Text := ReadStringFromStream(LDest, -1, IOHandler.DefStringEncoding{$IFDEF STRING_IS_ANSI}, IOHandler.DefAnsiEncoding{$ENDIF}); TIdFTPListResult(FListResult).FDetails := ADetails; TIdFTPListResult(FListResult).FUsedMLS := False; // FDirFormat will be updated in ParseFTPList... finally FreeAndNil(LDest); end; if ADest <> nil then begin ADest.Assign(FListResult); end; DoOnRetrievedDir; finally if LTrans <> ftASCII then begin TransferType := LTrans; end; end; end;
3.4 下载 procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload; procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload; //从远程服务器上获取文件。 属性说明:
示例代码: 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;
end;
提示:下载之前,查看 DirectoryListing.Items[sCurrFile].ItemType是否为文件,如返回为ditDirectory则代表当前文件名为目录,不能下载,必须导向到文件才可。如为文件,则可以进行下载。在下载前,设定传输的类型为二进制文件,并且指定本地要保存的路径。通过调用Get方法,实现文件的下载。下载过程较慢,可以考虑将其放到线程中实现。
3.5 上传 procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload; procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload; //上传文件至服务器 属性:
代码示例: if IdFTP1.Connected then
begin
if UploadOpenDialog1.Execute then
try
IdFTP1.TransferType := ftBinary;
IdFTP1.Put(UploadOpenDialog1.FileName, ExtractFileName(UploadOpenDialog1.FileName));//可以在此添加改变目录的代码;
finally
//完成清除工作
end;
end;
3.6 删除文件/文件夹 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;
创建时间:2020.05.11 更新时间:2020.06.16
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论