DBGridEh导出功能详解,用TIdFtp控件实现FTP协议
分类:web前端

于今数不完施用都亟需上传与下载大型文件,通过HTTP方式上传大文件有必然的局限性。幸而FTP作为贰个特出老何况特别干练的说道能够快捷牢固地成功大文件的上传下载,并且能够圆各处落到实处续传。就拿自个儿写的影视服务器管理端程序来讲,种种方案比较后,开掘使用FTP可以圆各处得以完毕供给。可是要经过WinSocket库完结FTP相比较费力,幸亏有Indy--一个卷入了大多数网络协议的组件包。 通过Indy,程序设计人士能够通过堵塞方式实行编制程序,能够废弃蹩脚的Winsocket异步格局,采取与Unix系统上等同的封堵编制程序情势举办。那样,程序猿就足以很好的管理程序的运营流程。

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);

 DELPHI IDftp

DBGridEh导出功效详细明白(SaveDBGridEhToExportFile表明卡塔尔

  日常常有顾客须要数据导出,对此,大家直接用最原始的艺术,张开查询,读取各种字段的数目,逐个的的写入文件。如下:

procedure TForm10.prExpData(pMode:Byte);
Var
  pFPath:String;
  pFName:String;   //Exp Name of prefix
  pFObject:string;
  pMyFile:TextFile;
  pStr:string;
  i:integer;
begin

        pFObject:='c:Exp_Sample.csv';

        AssignFile(pMyFile,pFObject);
        ReWrite(pMyFile);

        with DM.QR_ENJBTR_250 do begin
            CLOSE;
            open;

            //写入标题
            for i:=0 to DM.QR_ENJBTR_250.FieldCount-1 do begin
                pStr:=pStr+DM.QR_ENJBTR_250.FieldDefs.Items[i].Name+',';
            end;
            WriteLn(pMyFile,pStr);

            //写入内容
            while not EOF do begin
                pStr:='';
                For i:=0 to FieldCount-1 do begin
                    pstr:=pStr+Fields.Fields[i].AsString+',';
                end;
                //copy(pStr,1,Length(pStr)-1);
                WriteLn(pMyFile,pStr);
                Next;
            end;
        end;  //With end;
        xMsg:='--->成功导出PurPart明细表:'+pFObject; cpWriteLog(x_pLogFile,xMsg,1);  // V2033 Add
        CloseFile(pMyFile);
end;

  后来意识,其实DBGridEh控件提供了二个进度:SaveDBGridEhToExportFile,提供了很好的导出成效,可以实惠的将查询出的数额导出为txt,csv,html等格式的文本。
  表达如下:
  procedure SaveDBGridEhToExportFile( ExportClass: TDBGridEhExportClass; DBGridEh: TCustomDBGridEh; const FileName: String; IsSaveAll: Boolean);
  其中:
  ExportClass--导出文件类型,可以为以下值:TDBGridEhExportAsText, TDBGridEhExportAsCsv, TDBGridEhExportAsHTML, TDBGridEhExportAsRTF, TDBGridEhExportAsVCLDBIF,TDBGridEhExportAsXLS.
  DBGridEh--DBGridEh控件
  FileName--要导出的文件路线名称
  IsSaveAll--是还是不是导出全体数额:Y-导出整个数额;N:导出选拔部分多少。

  注意:
  使用时必需增多新的征引单元:DBGridEhImpExp(以下五个援引单元也非得存在:DBGridEh,  EhLibBDE卡塔尔国。

  示例:
  SaveDBGridEhToExportFile(pExpClass,dbgMain,pExpFile,TrueState of Qatar;    //导出总体数目。
  SaveDBGridEhToExportFile(pExpClass,TDBGridEh(ActiveControlState of Qatar,pExpFile,False卡塔尔(قطر‎;  //导出采纳数据

  +++
  附使用示例:
  ---
  环境:Delphi Version6.0[Build 6.163]+EhlibV3.4

  希图介绍如下:
  1,在窗体uses中,增加新的援用单元:DBGridEhImpExp(以下七个引用单元也亟须存在:DBGridEh,  EhLibBDEState of Qatar。
  2,在窗体中增加二个DBGridEh控件,并安装名字为:dbgMain(能够随意命名的State of Qatar。
  3,设置DBGridEh控件能够多种选用:在属性页中设置options-dgMultiSelect=true。为的是能够筛选范围,导出部分数据。
  4,为DBGridEh控件钦定DataSource数据源。
  5,增添TSaveDialog控件SaveDialog1,设定文件类型列表,和暗许文件类型,如下(也足以直接在属性页中设置卡塔尔:
  SaveDialog1.Filter:='Text files (*.txt)|*.TXT|Comma separated values (*.csv)|*.CSV|HTML file (*.htm)|*.HTM|Rich Text Format (*.rtf)|*.RTF|Microsoft Excel Workbook (*.xls)|*.XLS';  
  SaveDialog1.FilterIndex:=0;
  6,增加两上按键,分别为全体导出和局地导出,分别增加以下代码到按键的单击事件中。

//全体导出进程
procedure TForm1.btnAllExportClick(Sender: TObject);
var
  pExpClass:TDBGridEhExportClass;      //导出文件类型
  pExt:string ;                        //导出文件扩大名
  pExpFile:string;                     //导出文件路线及文件名称
  pExpFileExt:string;                  //SaveDialog1回到的文本名的扩充名
begin
    //清空SaveDialog1默许文件名
    SaveDialog1.FileName := '';

    if SaveDialog1.Execute then begin    //假如SaveDialog1不错实行
        case SaveDialog1.FilterIndex of     //遵照FilterIndex设置导出文件类型和扩大名
            1: begin pExpClass := TDBGridEhExportAsText; pExt := 'txt'; end;
            2: begin pExpClass := TDBGridEhExportAsCSV; pExt := 'csv'; end;
            3: begin pExpClass := TDBGridEhExportAsHTML; pExt := 'htm'; end;
            4: begin pExpClass := TDBGridEhExportAsRTF; pExt := 'rtf'; end;
            5: begin pExpClass := TDBGridEhExportAsXLS; pExt := 'xls'; end;
        else
            pExpClass := nil; pExt := '';
        end;
        if pExpClass <> nil then begin        //如果导出文件类型已经被正确安装
            pExpFile:= trim(SaveDialog1.FileName);
            pExpFileExt:= Copy(pExpFile,Length(pExpFile)-2,3);
            //判定再次来到的文件名称是还是不是业已满含正确的恢宏名,若无则拉长正确的扩充名
            if UpperCase(pExpFileExt) <> UpperCase(pExt) then
               pExpFile := pExpFile + '.' + pExt;

            SaveDBGridEhToExportFile(pExpClass,DBGridEh1,pExpFile,True卡塔尔国;    //按现存设置导出整体数据。
            //X_pMsg:='The data have saved as '+pExpFile;
            //stbForm.Panels[0].Text:=X_pMsg;
            MessageDlg('The data have saved as '+pExpFile,mtInformation,[mbOk],0);
        end;
    end;

end;

//部分导出进程
procedure TForm1.btnPartExportClick(Sender: TObject);
var
  pExpClass:TDBGridEhExportClass;      //导出文件类型
  pExt:string ;                        //导出文件扩张名
  pExpFile:string;                     //导出文件路线及文件名称
begin
    SaveDialog1.FileName := '';
    if (ActiveControl is TDBGridEh) then

        if SaveDialog1.Execute then begin
            case SaveDialog1.FilterIndex of
                1: begin pExpClass := TDBGridEhExportAsText; pExt := 'txt'; end;
                2: begin pExpClass := TDBGridEhExportAsCSV; pExt := 'csv'; end;
                3: begin pExpClass := TDBGridEhExportAsHTML; pExt := 'htm'; end;
                4: begin pExpClass := TDBGridEhExportAsRTF; pExt := 'rtf'; end;
                5: begin pExpClass := TDBGridEhExportAsXLS; pExt := 'xls'; end;
            else
                pExpClass := nil; pExt := '';
            end;

            if pExpClass <> nil then begin
                pExpFile:= trim(SaveDialog1.FileName);
                if UpperCase(Copy(pExpFile,Length(pExpFile)-2,3)) <> UpperCase(pExt) then
                   pExpFile := pExpFile + '.' + pExt;

                SaveDBGridEhToExportFile(pExpClass,TDBGridEh(ActiveControl),pExpFile,False);
                X_pMsg:='The data have saved as '+pExpFile;
                stbForm.Panels[0].Text:=X_pMsg;
                MessageDlg(x_pMsg,mtInformation,[mbOk],0);
            end;
        end;

end;

 

  --本文来源于[TTT BLOG]:

 

(提示:转发时请必须保留版权音信依然注脚来源。卡塔尔

上面,大家进去到Indy的TIdFtp世界。

判定是还是不是连接
if IdFTP1.Connected then
begin
...........
end;

FTP是三个标准公约,它是在微型机和互联网之间调换文件的最简易的不二等秘书技。
FTP也是使用TCP/IP公约的选用公约正式。
FTP通常于将小编的文件上传至服务器,或从服务器上下传文书的一种多如牛毛的行使方法作为客商,您能够用特简单的DOS分界面来选取FTP,也得以选择由第三方提供的软件(如FLASHFXP)来对服务器的数额开展删减,重命名等操作。
自然,使用这个在此之前,必需先要登陆服务器,用内定的顾客名和密码或无名氏(Anonymous)登入。
那么些我们都知情,不过还是讲一下。用DOS操作FTP小编不讲了。笔者前天最首要用INDY组件里的IDFTP控件做一FTP客户端软件(非常简单) 了
笔者今日讲一下IDFTP控件的多少个属性如下:
Host:FTP服务器地址。
USEWrangler:客商帐号。
Password:密码。
Passive:用于调整FTP数据连接格局。FTP的数目传输可以有积极和低沉。
PORT是积极方式,在创制数据通道时,服务端去老是外人;
PASV是被动形式,在创建数据通道时,服务端被别人连接;
树立数据通道时,用PORT形式如故PASV形式,接收权在于FTP客商端。
IDFTP里的passive是三个Boolean数据类型。当True时为主动;当false时为被动。
Port:FTP服务的暗中同意端口是21。
TransferType:传输文件的品种,能够取值为FtBinary(8位的轻便文件)和FtAscii(7位的公文文件)。
SystemDesc:FTP服务器的汇报。
IDFTP的多少个主意
常用的办法有以下多少个:
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服务器上的当前目录
原型为: procedure ChangeDir(const ADirName:string);
ChangeDirUp:将FTP服务器上的目录再次回到到您目录.
温州-Dillon(86695893) 13:08:26
MakeDir:在服务器上树立叁个新目录.
原型为:
procedure MakeDir(const ADirName:String);
RemoveDir:删除服务器上的贰个目录.
原型为:
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:用于向服务器上传文件.该方式被重载.
原型为:
procedure Put(const ASourceFile:TStream;const ADest:string;const Appand:Boolean);overload;
procedure Put(const ASourceFile:string;const ADest:string;const AAppand:Boolean);overload;
KillDataChannal:关闭FTP数据通道.
所谓“重载”,正是当从三个“类”身上继续部分艺术时,会产生冲突。为了幸免那一个冲突,就选用了“重载”作用
Delete:删除FTP服务器上三个文件.
原形为:procedure Delete(const AfileName:string);
Rename:校订服务器上的文书名.
原型为:
procedure Rename(const ASourceFile:string;const ADestFile:string);
Size:获取文件大小新闻.
原型为:
function Size(const AFileName:string):Integer;
当大家装好INDY9.0 附带四个例程,在INDYFTPDEMO下能够找到.
是多少个不易的DEMO
本人仿造那么些DEMO做的三个例证。里面富含详细的注明。
当然,还要讲一下,做FTP顾客端的体会哦
本身现在,稳步把此中的代码发了来做一下教师
先是是登陆开关里的代码:
依旧先给大家看一下以此分界面吧
Delete:删除FTP服务器上一个文件.
原形为:procedure Delete(const AfileName:string);
Rename:改良服务器上的文件名.
原型为:
procedure Rename(const ASourceFile:string;const ADestFile:string);
Size:获取文件大小消息.
原型为:
function Size(const AFileName:string):Integer;
begin
ftpcon.Enabled:=false;
//-----------------连接FTP服务器------------------//
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(CULX570DIRubicon.Text卡塔尔国卡塔尔国; // 改造近些日子路径
FTPCon.Enabled:=false; // 连接按键
FTPDisCon.Enabled:=True; // 断开开关
end;
end;
end;
end;
断开按键的代码:
begin
try
if IdFTP.Connected then // 决断顾客端是还是不是衔接服务器
IdFTP.Abort;
if TransferrignData then // 推断客商端与服务器之间是还是不是有数据传输
IdFTP.Quit;
finally
IdFTP.Disconnect; // 断开连接
FTPCon.Enabled:=true;
FTPDisCon.Enabled:=false;
end;
end;
TransferrignData变量全局变量里有定义的
连接开关里的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(LSState of Qatar; // 把IDFTP里的LIST与LS关联起来
DirectoryListBox.Items.Assign(LS卡塔尔国; // 把DIRECTO昂科威YLISTBOX 与 LS 关联起来
if DirectoryListBox.Items.Count > 0 then
if AnsiPos('total', DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);
finally
LS.Free;
end;
end;
再有一个最重大的一段代码,正是listbox如何展现目录音信的
第一,把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);
DirectoryList博克斯.Canvas.TextOut(Evoque.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(Murano.Left, Rect.Top, FormatDateTime('yyyy-mm-dd hh:mm', ModifiedDateState of QatarState of Qatar; // 纠正时间
//------------------------//
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(牧马人.Left, Rect.Top, OwnerNameState of Qatar; // 具有者名字
//------------------------//
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来落到实处进程条
还恐怕有上传代码:
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;
end;
这段代码,首先要咬定IDFTP是不是还连着
下传代码如下:
温州-Dillon(86695893) 13:36:23
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(NameState of Qatar; // 获得文件的尺寸
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;
自小编要直接做在目录列表框的双击方法里的,假若双击文件就下载,文件夹就开拓
其余的作用,都是经过IDFTP的点子间接完成的。比如新建目录:
var
DirName:string;
begin
DirName:=InputBox('输入新目录名称', '提示音信', ''State of Qatar;
if DirName <> '' then
try
IdFTP.MakeDir(DirName);
DisplayDir(CURDIR.Text);
finally
end;
end;
就此,对于FTP客商端的任课也就好像些了。
是啊,把装有代码都裁减传到分享里
noop只是顾客端连到服务器,不棉被和衣服务端T了

1.控件的求证

引用别人一下,做为本人之后笔记

采纳Indy 9中的TIdFtp控件能够完成通过FTP方式开展文件的上传与下载。

现行反革命无数接受都亟待上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。好在FTP作为叁个格外老並且那多少个干练的磋商得以高速稳定地做到大文件的上传下载,何况可以周全地达成续传。就拿自家写的影片服务器管理端程序来讲,各类方案相比较后,开采使用FTP可以周详地促成供给。不过要通过WinSocket库完成FTP比较繁重,幸好有Indy--一个装进了绝大多数网络公约的组件包。
由此Indy,程序设计职员可以经过阻塞格局开展编制程序,能够放弃蹩脚的Winsocket异步方式,选取与Unix系统上等同的窒碍编制程序格局实行。那样,程序猿就能够很好的处理程序的运转流程。
下边,大家进去到Indy的TIdFtp世界。

2.控件的切实可行行使

1.控件的证实

(1)控件属性设置

行使Indy 9中的TIdFtp控件可以实现通过FTP方式进行文件的上传与下载。

暗许属性就能够,与服务器连接直接有关的特性如主机名与客商等在创立连接时开展设定。需求设定的是RecvBufferSize和SendBufferSize两属性的值。别的部需要要基于要传输的文件类型钦赐TransferType属性,而任何品质按默许值设定就能够。

2.控件的现进行使

RecvBufferSize表达(默许值为8192字节):该属性为整型变量,用于内定连接所用的承担缓冲区大大小小。

(1)控件属性设置

SendBufferSize表达(默许值为32768字节):该属性也为整型变量,用于钦点连接所用的发送缓冲区的最大值。该属性在WriteStream方法中时,可用于TStream内定要发送内容的块数。假若要发送的剧情当先本属性值,则发送内容被分为三个块发送。

暗许属性就能够,与服务器连接直接有关的习性如主机名与客户等在创设连接时举行设定。必要设定的是RecvBufferSize和SendBufferSize两属性的值。别的索要基于要传输的文件类型内定TransferType属性,而其余质量按暗许值设定就可以。

TransferType表明(暗中同意值为ftBinary):该属性为TIdFTPTransferType型变量。用于钦命传输内容是二进制文件(ftBinary )照旧ASCII文件(ftASCII)。应用程序必要接收二进制方式传输可施行文件、压缩文件和多媒体文件等;而采纳ASCII方式传输文本或超文本等文本型数据。

RecvBufferSize表明(暗中同意值为8192字节):该属性为整型变量,用于钦点连接所用的接收缓冲区大小。

(2)控件的事件响应

SendBufferSize表明(默许值为32768字节):该属性也为整型变量,用于钦点连接所用的发送缓冲区的最大值。该属性在WriteStream方法中时,可用来TStream钦点要发送内容的块数。借使要发送的源委超过本属性值,则发送内容被分成多少个块发送。

OnDisconnected响应:TNotify伊夫nt类,用于响应断开(disconnect)事件。当Disconnect方法被调用用来关闭Socket的时候,触发该响应。应用程序必须钦点该事件响应的进度,以便对该断开事件进展对应。

TransferType表明(私下认可值为ftBinary):该属性为TIdFTPTransferType型变量。用于钦定传输内容是二进制文件(ftBinary )依旧ASCII文件(ftASCII)。应用程序要求动用二进制格局传输可实行文件、压缩文件和多媒体文件等;而接纳ASCII格局传输文本或超文本等文本型数据。

OnStatus响应:TIdStatus伊夫nt类。该响应在目前一而再三番若干遍的气象变化时被触发。该事件可由DoStatus方法触发并提必要事件调控器属性。axStatus是现阶段连连的TIdStatus值;aaArgs是八个可选的参数用于格式化函数,它将用来协交易会现当前连续几天景况的文书音信。

(2)控件的事件响应

OnWork响应:OnWord是TWorkEvent类事件的响应调整器。OnWork用于关联DoWork方法当缓冲区读写操作被调用时通报Indy组件和类。它日常被用于调控进程条和视窗成分的换代。AWorkMode表示近年来操作的方式,此中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount提示当前操作的字节计数。

OnDisconnected响应:TNotifyEvent类,用于响应断开(disconnect)事件。当Disconnect方法被调用用来关闭Socket的时候,触发该响应。应用程序必需钦点该事件响应的经过,以便对该断开事件打开相应。

OnWorkBegin响应:TWorkBegin伊芙nt类。当缓冲区读写操作起先化时,该事件涉及BeginWork方法用于文告Indy组件和类。它日常被用来调整进程条和视窗成分的更新。AWorkMode表示近年来操作的形式,个中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount马克斯用于提示发送到OnWorkBegin事件的操作的最大字节数,0值代表未知。

OnStatus响应:TIdStatusEvent类。该响应在日前接连的情事变化时被触发。该事件可由DoStatus方法触发并提供给事件调节器属性。axStatus是时下连连的TIdStatus值;aaArgs是一个可选的参数用于格式化函数,它将用以组织表现当前接连几天情形的文本新闻。

OnWorkEnd响应:TWorkEnd伊芙nt类。当缓冲区读写操作终止时,该事件关联EndWork方法用于布告Indy组件和类。AWorkMode表示近来操作的形式,此中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount表示操作的字节数。

OnWork响应:OnWord是TWork伊夫nt类事件的响应调节器。OnWork用于关联DoWork方法当缓冲区读写操作被调用时通报Indy组件和类。它日常被用来调整进程条和视窗成分的立异。AWorkMode表示目前操作的格局,在那之中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount提醒当前操作的字节计数。

在事变响应中,主要通过上述三种事件响应来决定程序。在相仿情况下,在OnDisconnected中设定连接断开的分界面通告;在OnStatus中设定当前操作的图景;在OnWork中得以实现传输中状态条和任何参数的显得;而在OnWorkBegin和OnWorkEnd中分别设定最初传输和传导停止时的分界面。

OnWorkBegin响应:TWorkBegin伊芙nt类。当缓冲区读写操作最早化时,该事件波及BeginWork方法用于文告Indy组件和类。它日常被用来调控进程条和视窗成分的换代。AWorkMode表示最近操作的形式,个中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCountMax用于指示发送到OnWorkBegin事件的操作的最大字节数,0值代表未知。

(3)连接远程服务器

OnWorkEnd响应:TWorkEndEvent类。当缓冲区读写操作终止时,该事件关联EndWork方法用于文告Indy组件和类。AWorkMode表示近些日子操作的情势,个中:wmRead-组件正在读取数据;wmWrite-组件正在发送数据。AWorkCount表示操作的字节数。

造成了设定控件属性和兑现了控件的风浪响应后,就足以与服务器实行人机联作和传导了。在延续以前,应首先决断IdFtp是不是处在连接景况,借使Connected为False,则经过分界面控件或此外方法钦定与服务器连接相关的一部分TCP类属性的安装,分别是:Host(主机名):String、Username(顾客名):String、Password(密码):String,也足以钦赐Port(端口卡塔尔国。之后调用Connect方法连接远程服务器,假若无特别现身则连年成功构造建设。

在事变响应中,首要透过上述种种事件响应来支配程序。在雷同意况下,在OnDisconnected中设定连接断开的分界面布告;在OnStatus中设定当前操作的动静;在OnWork中达成传输中状态条和其余参数的来得;而在OnWorkBegin和OnWorkEnd中分别设定发轫传输和传导停止时的分界面。

进度表达:procedure Connect(AAutoLogin: boolean; const A提姆eout: Integer,',','卡塔尔;

(3)连接远程服务器

该进度接连远程FTP服务器

完了了设定控件属性和兑现了控件的风浪响应后,就足以与服务器举办人机联作和传导了。在连接从前,应首先推断IdFtp是或不是处于连接情形,借使Connected为False,则经过分界面控件或任何方法钦定与服务器连接相关的一部分TCP类属性的安装,分别是:Host(主机名):String、Username(顾客名):String、Password(密码):String,也足以内定Port(端口卡塔尔国。之后调用Connect方法连接远程服务器,倘使无极其现身则延续成功建立。

属性:AAutoLogin: boolean = True

进度表达:procedure Connect(AAutoLogin: boolean; const ATimeout: Integer卡塔尔国;

延续后自动登陆,该参数默感觉True。

该进度接连远程FTP服务器

const ATimeout: Integer = IdTimeoutDefault

属性:AAutoLogin: boolean = True

逾期时间,单位:秒。

接连后自行登入,该参数默认为True。

演示代码:

const ATimeout: Integer = IdTimeoutDefault

if IdFTP1.Connected then try

过期时间,单位:秒。

if TransferrignData then IdFTP1.Abort;

示范代码:

IdFTP1.Quit;

if IdFTP1.Connected then try

finally

if TransferrignData then IdFTP1.Abort;

end

IdFTP1.Quit;

else with IdFTP1 do try

finally

Username := UserIDEdit.Text;

end

Password := PasswordEdit.Text;

else with IdFTP1 do try

Host := FtpServerEdit.Text;

Username := UserIDEdit.Text;

Connect;

Password := PasswordEdit.Text;

ChangeDir(CurrentDirEdit.Text,',',');

Host := FtpServerEdit.Text;

finally

Connect;

end;

ChangeDir(CurrentDirEdit.Text);

(4)退换目录

finally

连天创设后,能够改换前段时间FTP会话所在的目录。对于已知相对路线的情状下,能够直接调用ChangeDir(const ADirName: string卡塔尔国方法来改造目录,ADirName表示服务器上的文件系统目录,此外仍然为能够调用ChangeDirUp回到上级目录。

end;

假定未知路线,则能够透过List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean卡塔尔(قطر‎进程得到远程服务器的当前目录构造,那时候必须设定TransferType为ftASCII(ASCII形式),个中:ADest保存当前目录布局,可以在继续程序中调用该列表。此外可以由此RetrieveCurrentDir方法赢妥帖前目录名。

(4)改造目录

经过表明:

接连创设后,能够更改前段时间FTP会话所在的目录。对于已知相对路线的图景下,可以一贯调用ChangeDir(const ADirName: string卡塔尔国方法来更动目录,ADirName表示服务器上的文件系统目录,此外还足以调用ChangeDirUp回到上级目录。

procedure ChangeDir(const ADirName: string,',',');

如若未知路线,则能够经过List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean卡塔尔进度得到远程服务器的当前目录布局,当时必得设定TransferType为ftASCII(ASCII情势),当中:ADest保存当前目录构造,能够在持续程序中调用该列表。其余可以经过RetrieveCurrentDir方法得到当前目录名。

改动职业目录

进度表达:

属性

procedure ChangeDir(const ADirName: string);

const ADirName: string

改造工作目录

远程服务器的目录描述

属性

表明:该进度实际上是兑现了FTP CWD命令。

const ADirName: string

procedure ChangeDirUp;

长间隔服务器的目录描述

到上顶级目录

证实:该进程实际上是促成了FTP CWD命令。

function RetrieveCurrentDir: string;

procedure ChangeDirUp;

该函数重临当前目录名

到上超级目录

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

function RetrieveCurrentDir: string;

列出当前目录全体文件和子目录及其性质

该函数重返当前目录名

参数:

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

ADest: TStrings

列出当前目录全体文件和子目录及其个性

封存文件及子目录的回到结果

参数:

const ASpecifier: string = ´´

ADest: TStrings

文件掩码,用于列出切合条件的文书

封存文件及子目录的回来结果

const ADetails: boolean = true

const ASpecifier: string =

包涵文件和子目录属性

文本掩码,用于列出符合条件的文件

property DirectoryListing: TIdFTPListItems;

const ADetails: boolean = true

归来文件及目录布局的列表

包涵文件和子目录属性

亲自去做代码:

property DirectoryListing: TIdFTPListItems;

LS := TStringList.Create;

回去文件及目录结构的列表

try

演示代码:

IdFTP1.ChangeDir(DirName,',',');

LS := TStringList.Create;

IdFTP1.TransferType := ftASCII;

try

CurrentDirEdit.Text := IdFTP1.RetrieveCurrentDir;

IdFTP1.ChangeDir(DirName);

DirectoryListBox.Items.Clear;

IdFTP1.TransferType := ftASCII;

IdFTP1.List(LS,',',');

CurrentDirEdit.Text := IdFTP1.RetrieveCurrentDir;

DirectoryListBox.Items.Assign(LS,',',');

DirectoryListBox.Items.Clear;

if DirectoryListBox.Items.Count > 0 then

IdFTP1.List(LS);

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

DirectoryListBox.Items.Assign(LS);

finally

if DirectoryListBox.Items.Count > 0 then

LS.Free;

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

end;

finally

(5)下载的兑现

LS.Free;

在下载在此以前,必需查看DirectoryListing.Items[sCurrFile].ItemType是还是不是为文件,如重临为ditDirectory则意味当前文件名称叫目录,不可能下载,必得导向到文件才可。如为文件,则足以举行下载。在下载前,设定传输的门类为二进制文件,並且钦赐地点要保留的门径。通过调用Get方法,完成公文的下载。下载进程非常慢,能够假造将其置于线程中落到实处。

end;

经过表明:

(5)下载的落到实处

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

在下载在此以前,必得查看DirectoryListing.Items[sCurrFile].ItemType是还是不是为文件,如重返为ditDirectory则表示当前文件名称叫目录,不可能下载,必须导向到文件才可。如为文件,则能够举办下载。在下载前,设定传输的品种为二进制文件,何况内定地点要封存的门路。通过调用Get方法,达成公文的下载。下载进度超慢,能够诬捏将其放置线程中贯彻。

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

进度表达:

从远程服务器上获得文件。

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 ASourceFile: string

保留到客商机上的文书名

长途服务器上的源文件名

const ACanOverwrite: boolean = false

const ADestFile: string

重写同名文件

保留到客商机上的文件名

AResume: Boolean = false

const ACanOverwrite: boolean = false

是或不是进行断点续传

重写同名文件

演示代码:

AResume: Boolean = false

SaveDialog1.FileName := Name;

是或不是开展断点续传

if SaveDialog1.Execute then begin

示范代码:

SetFunctionButtons(false,',',');

SaveDialog1.FileName := Name;

IdFTP1.TransferType := ftBinary;

if SaveDialog1.Execute then begin

BytesToTransfer := IdFTP1.Size(Name,',',');

SetFunctionButtons(false);

if FileExists(Name) then begin

IdFTP1.TransferType := ftBinary;

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

BytesToTransfer := IdFTP1.Size(Name);

mtConfirmation, mbYesNoCancel, 0) of

if FileExists(Name) then begin

mrYes: begin

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

BytesToTransfer := BytesToTransfer - FileSizeByName(Name,',',');

mtConfirmation, mbYesNoCancel, 0) of

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

mrYes: begin

end;

BytesToTransfer := BytesToTransfer - FileSizeByName(Name);

mrNo: begin

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

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

end;

end;

mrNo: begin

mrCancel: begin

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

exit;

end;

end;

mrCancel: begin

end;

exit;

end

end;

else begin

end;

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

end

end;

else begin

(6)上传的达成

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

上传的落到实处与下载相通,通过put方法就可以。

end;

经过表达:

(6)上传的贯彻

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

上传的兑现与下载相同,通过put方法就可以。

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

进度表明:

上传文件至服务器

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 ASourceFile: string

服务器上的对象文件名

将要被上传的文本

const AAppend: boolean = false

const ADestFile: string =

是还是不是一而再再而三上传

服务器上的目的文件名

代码示例:

const AAppend: boolean = false

if IdFTP1.Connected then begin

是还是不是持续上传

if UploadOpenDialog1.Execute then try

代码示例:

IdFTP1.TransferType := ftBinary;

if IdFTP1.Connected then begin

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

if UploadOpenDialog1.Execute then try

//能够在这里加多改换目录的代码;

IdFTP1.TransferType := ftBinary;

finally

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

//完结解除工作

//能够在这里增多改过目录的代码;

end;

finally

end;

//完结清除职业

(7)删除的兑现

end;

删除文件使用Delete方法,该办法删除钦定的文书,删除对象必须为文件。要是要去除目录则利用RemoveDir方法。

end;

进程表达:

(7)删除的贯彻

procedure Delete(const AFilename: string,',',');

删除文件使用Delete方法,该格局删除钦命的公文,删除对象必得为文件。假若要刨除目录则动用RemoveDir方法。

删除文件

进度表明:

procedure RemoveDir(const ADirName: string,',',');

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

if not IdFTP1.Connected then exit;

idftp1.RemoveDir(Name,',',');

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

finally

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

end

idftp1.RemoveDir(Name);

else

finally

try

end

idftp1.Delete(Name,',',');

else

finally

try

end;

idftp1.Delete(Name);

(8)后退的完成

finally

后退在实质上是目录操作的一种,能够差相当少的改造当前目录为..来落实,也足以经过回到上级目录来促成。

end;

(9)废除的实现

(8)后退的落到实处

在IdFtp的传导进程中,能够任何时候使用abort方法打消当前操作。能够的OnWork事件的落到实处中来规定曾几何时废除操作。

后退在实际上是目录操作的一种,能够简单的退换当前目录为..来兑现,也得以透过回到上级目录来得以完毕。

代码示例:

(9)撤消的落到实处

//裁撤按键的OnClick响应

在IdFtp的传导进度中,能够每三十14日使用abort方法裁撤当前操作。能够的OnWork事件的落到实处中来鲜明何时撤消操作。

procedure TMainForm.AbortButtonClick(Sender: TObject,',',');

代码示例:

begin

//撤除开关的OnClick响应

AbortTransfer := true;

procedure TMainForm.AbortButtonClick(Sender: TObject);

end;

begin

//IdFTP的OnWork事件响应

AbortTransfer := true;

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

end;

const AWorkCount: Integer,',',');

//IdFTP的OnWork事件响应

begin

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

...

const AWorkCount: Integer);

if AbortTransfer then IdFTP1.Abort;

begin

AbortTransfer := false;

...

end;

if AbortTransfer then IdFTP1.Abort;

(10)断点续传的贯彻

AbortTransfer := false;

断点续传正是在上传或下载进程起始时,剖断已经传输过的文件是不是上传输停止,假使传输未有得逞达成,则在上次中断处继续展开传输工作。完毕该意义供给八个基本点的操作,首先是判定文件的高低消息,其次是在传输进度Get和Put中钦命上传的一坐一起。

end;

看清服务器上文件的高低使用函数Size(FileName卡塔尔国。在下载进程中,相比较当麻芋果件和长间隔文件的音信,然后在Get中内定AResume := True就能够。而上传也一直以来,钦命Put的AAppend := True就足以了。

(10)断点续传的落到实处

在前头我们讲过,Indy的互联网操作超越八分之四是拥塞情势的,TIdFtp也不例外。那样在上述顺序操作运营进程的时候客户界面被权且冷冻,应当要等待调用再次回到技艺三番四遍客商操作分界面响应。所以在骨子里编程中,须求接收四线程的主意来担保户分界面包车型地铁响应。Windows系统能够使用CreateThread系统调用来创设线程,可是在应用的时候供给开荒职员做过多非常的行事来承保线程的一同等难题。而Indy中也饱含了落实三十二线程的控件TIdThreadComponent,相对照之下该控件达成八线程时越发便利,也更易于调节。

断点续传正是在上传或下载进度最早时,判定已经传输过的文书是还是不是上传输甘休,借使传输未有马到成功实现,则在上次中断处继续拓宽传输职业。完毕该功用要求多少个至关心珍视要的操作,首先是决断文件的大小音信,其次是在传输进度Get和Put中内定上传的一言一动。

判定服务器上文件的高低使用函数Size(FileNameState of Qatar。在下载进度中,比较当麻芋果件和远程文件的新闻,然后在Get中钦赐AResume := True就能够。而上传也一直以来,钦点Put的AAppend := True就能够了。

在前面大家讲过,Indy的互联网操作大部分是梗塞形式的,TIdFtp也不例外。那样在上述顺序操作运转进度的时候客户界面被目前冷冻,一定要等待调用重临才具一连顾客操作分界面响应。所以在实质上编制程序中,须求动用八十多线程的措施来确定保证户分界面包车型大巴响应。Windows系统能够采用CreateThread系统调用来创设线程,不过在使用的时候需求开荒职员做过多额外的做事来确定保证线程的联合具名等题材。而Indy中也隐含了实现多线程的控件TIdThreadComponent,相对照之下该控件完成七十十六线程时尤其有利,也更便于调整。笔者将要继续的文章里为我们介绍TIdThreadCOmponent的接收办法

你大概感兴趣的篇章:

  • ASP.NET配置文件Web.config用法详整
  • ASP.net全局程序文件Global.asax用法深入分析
  • ASP.NET中IsPostBack用法详整
  • ASP.NET Dictionary 的着力用法示例介绍
  • 有关ASP.NET中TreeView用法的二个小例子
  • 深入明白Asp.net中DataBinder.Eval的用法总括
  • asp.net的IndexOf,LastIndexOf,IndexOfAny和LastIndexOfAny的用法
  • asp.net中for和do循环语句用法分享
  • ASP.NET Eval 求值运算的有的用法
  • TreeView 用法(有代码)(asp.net)
  • asp.net Md5的用法小结
  • ASP.NET中TimeSpan的用法实例解析

本文由10bet手机官网发布于web前端,转载请注明出处:DBGridEh导出功能详解,用TIdFtp控件实现FTP协议

上一篇:delphi在桌面上显示文字代码,动态内存查找法 下一篇:写3389自动登录器
猜你喜欢
热门排行
精彩图文