📄 unit1.pas
字号:
{********************************************
FTP上传下载Demo
说明:功能还没有完全完成,只是简单的上传与下
载,在上传时断点续传还有些问题。仅供参考
作者:5207 于2008-12-17
http://www.mini188.com/ 点滴论坛
********************************************}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, msxmldom,
IdBaseComponent,
IdComponent, IdFTP, IdTCPConnection, IdTCPClient,
ComCtrls, ImgList, IdFTPCommon, ExtCtrls, IdIOHandler,
IdIOHandlerSocket, IdAntiFreezeBase, IdAntiFreeze, IdIntercept;
type
TForm1 = class(TForm)
Button2: TButton;
IdFTP1: TIdFTP;
Label1: TLabel;
Button4: TButton;
Button5: TButton;
SaveDialog1: TSaveDialog;
ListView1: TListView;
ImageList1: TImageList;
Label2: TLabel;
Label3: TLabel;
edtUserName: TEdit;
Label4: TLabel;
edtPwd: TEdit;
edtHost: TEdit;
btnPost: TButton;
OpenDialog1: TOpenDialog;
Button6: TButton;
Memo2: TMemo;
Button7: TButton;
Button3: TButton;
Button8: TButton;
pb1: TProgressBar;
Button9: TButton;
Button10: TButton;
IdConnectionIntercept1: TIdConnectionIntercept;
IdAntiFreeze1: TIdAntiFreeze;
IdIOHandlerSocket1: TIdIOHandlerSocket;
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnPostClick(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure IdFTP1AfterClientLogin(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure IdFTP1Connected(Sender: TObject);
procedure IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
procedure Button7Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FSrcFile: string;
FStopFtp: Boolean;
FAbortFtp: Boolean;
FPutFile: string;
FFtpDirList: TStringList;
procedure ChageDir(DirName: String);
function GetNameFromDirLine(Line: String;
var IsDirectory: Boolean): String;
procedure Log(const AMsg: string);
procedure PutFile(const AFileName: string);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
IdFTP1.Host := edtHost.Text;
IdFTP1.Username := edtUserName.Text;
IdFTP1.Password := edtPwd.Text;
IdFTP1.Disconnect;
IdFTP1.Connect;
if IdFTP1.Connected then
begin
Label1.Caption := '连接成功';
ChageDir('\');
end
else
Label1.Caption := '连接失败';
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ChageDir('\');
end;
procedure TForm1.Button5Click(Sender: TObject);
var
stream: TFileStream;
sDownToFileName: string;
bIsDir: Boolean;
sDir: string;
begin
if ListView1.Selected = nil then Exit;
if not IdFTP1.Connected then
raise Exception.Create('未连接FTP服务器');
if SaveDialog1.Execute then
begin
sDownToFileName := SaveDialog1.FileName;
if FileExists(sDownToFileName) then
stream := TFileStream.Create(sDownToFileName, fmOpenWrite)
else
stream := TFileStream.Create(sDownToFileName, fmCreate);
try
if ListView1.Items.Count > 0 then
begin
sDir := GetNameFromDirLine(FFtpDirList.Strings[ListView1.ItemIndex], bIsDir);
if not bIsDir then
begin
pb1.Max := IdFTP1.Size(sDir);
pb1.Position := stream.Size;
stream.Position := stream.Size;
IdFTP1.Get(sDir, stream, True);
ChageDir(IdFTP1.RetrieveCurrentDir);
end;
end;
finally
FreeAndNil(stream);
end;
end;
end;
procedure TForm1.ChageDir(DirName: String);
var
i: Integer;
bIsDir: Boolean;
sPathName: string;
lvItem: TListItem;
begin
ListView1.Items.Clear;
FFtpDirList.Clear;
if not IdFTP1.Connected then Exit;
ListView1.Items.BeginUpdate;
try
IdFTP1.ChangeDir(DirName);
IdFTP1.TransferType := ftASCII;
IdFTP1.List(FFtpDirList);
bIsDir := False;
for i := 0 to FFtpDirList.Count -1 do
begin
lvItem := ListView1.Items.Add;
lvItem.Caption := GetNameFromDirLine(FFtpDirList.Strings[i], bIsDir);
end;
finally
ListView1.Items.EndUpdate;
end;
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
var
bIsDir: Boolean;
sDir: string;
begin
if ListView1.Selected = nil then Exit;
if ListView1.Items.Count > 0 then
begin
sDir := GetNameFromDirLine(FFtpDirList.Strings[ListView1.ItemIndex], bIsDir);
if bIsDir then
ChageDir(sDir);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ws: DWORD;
begin
FFtpDirList := TStringList.Create;
FAbortFtp := False;
FStopFtp := False;
end;
procedure TForm1.PutFile(const AFileName: string);
var
mm: TFileStream;
iFileSize: Int64;
begin
mm := TFileStream.Create(AFileName, fmOpenRead);
try
try
pb1.Max := mm.Size;
iFileSize := IdFTP1.Size(ExtractFileName(AFileName));
if iFileSize <> -1 then
begin
pb1.Position := iFileSize;
mm.Position := iFileSize;
// mm.Seek(iFileSize, soFromBeginning);
IdFTP1.Quote('REST ' + FloatToStr(iFileSize));
IdFTP1.Put(mm, ExtractFileName(AFileName), True);
end
else
IdFTP1.Put(mm, ExtractFileName(AFileName));
ChageDir(IdFTP1.RetrieveCurrentDir);
except
end;
finally
FreeAndNil(mm);
end;
end;
procedure TForm1.btnPostClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
FPutFile := OpenDialog1.FileName;
PutFile(FPutFile);
end;
end;
//获取文件或目录名
function TForm1.GetNameFromDirLine(Line: string; var IsDirectory: Boolean): string;
var
i: Integer;
DosListing: Boolean;
begin
IsDirectory := Line[1] = 'd';
DosListing := false;
for i := 0 to 7 do begin
if (i = 2) and not IsDirectory then
begin
//IsDirectory := Copy(Line, 1, Pos(' ', Line) - 1) = '<DIR>';
IsDirectory := Copy(Line, 1, Pos(' ', Line) - 1) = '<DIR>';
if not IsDirectory then
DosListing := Line[1] in ['0'..'9']
else
DosListing := true;
end;
Delete(Line, 1, Pos(' ', Line));
While Line[1] = ' ' do Delete(Line, 1, 1);
if DosListing and (i = 2) then break;
end;
Result := Line;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
iRtn: Integer;
begin
if IdFTP1.Connected then
begin
iRtn := IdFTP1.SendCmd('REST 1');
if iRtn = 350 then
ShowMessage('支持断点续传')
else
ShowMessage('不支持断点续传');
end;
end;
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
pb1.Position := AWorkCount;
try
if FStopFtp then
begin
//IdFTP1.CheckForGracefulDisconnect(False);
IdFTP1.Abort;
// IdFTP1.Disconnect;
end;
except
Log('操作被中止');
end;
Application.ProcessMessages;
end;
procedure TForm1.IdFTP1AfterClientLogin(Sender: TObject);
begin
Log(IdFTP1.LoginMsg.Text.Text);
end;
procedure TForm1.Log(const AMsg: string);
begin
Memo2.Lines.Add(AMsg);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
IdFTP1.Disconnect;
CanClose := True;
end;
procedure TForm1.IdFTP1Connected(Sender: TObject);
begin
Log('Ftp Is Connected');
end;
procedure TForm1.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
Log(AStatusText);
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
IdFTP1.Quit;
ChageDir('\');
Label1.Caption := '关闭了连接';
// IdFTP1.Disconnect;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
FStopFtp := not FStopFtp;
if FStopFtp then
begin
Button3.Caption := '继续';
FStopFtp := True;
end
else
begin
Button3.Caption := '中止';
FStopFtp := False;
end;
// PutFile(FPutFile);
end;
procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
FAbortFtp := False;
FStopFtp := False;
end;
procedure TForm1.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
FAbortFtp := False;
// if AWorkMode in [wmRead, wmWrite] then
// pb1.Position := pb1.Max;
end;
procedure TForm1.Button8Click(Sender: TObject);
var
bIsDir: Boolean;
sDir: string;
begin
if ListView1.Selected = nil then Exit;
if ListView1.Items.Count > 0 then
begin
sDir := GetNameFromDirLine(FFtpDirList.Strings[ListView1.ItemIndex], bIsDir);
if not bIsDir then
begin
IdFTP1.Delete(sDir);
ChageDir(IdFTP1.RetrieveCurrentDir);
end;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
FAbortFtp := true;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
ChageDir(IdFTP1.RetrieveCurrentDir);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FFtpDirList) then FreeAndNil(FFtpDirList);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -