📄 main.pas
字号:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, clFTP, clFTPUtils, clUtils, newDlg, fileDlg,
clTcpClient;
type
TMainForm = class(TForm)
Label3: TLabel;
memLog: TMemo;
ProgressBar: TProgressBar;
Label1: TLabel;
Label2: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
edtServer: TEdit;
edtPort: TEdit;
edtUser: TEdit;
edtPassword: TEdit;
edtStartDir: TEdit;
cbPassiveMode: TCheckBox;
cbAsciiMode: TCheckBox;
btnLogin: TButton;
btnLogout: TButton;
btnOpenDir: TButton;
btnGoUp: TButton;
btnMakeDir: TButton;
btnRemoveDir: TButton;
btnDownload: TButton;
btnUpload: TButton;
btnDeleteFile: TButton;
btnRename: TButton;
btnAbort: TButton;
lbList: TListBox;
Label7: TLabel;
clFTP: TclFTP;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
procedure btnLoginClick(Sender: TObject);
procedure btnLogoutClick(Sender: TObject);
procedure btnOpenDirClick(Sender: TObject);
procedure btnGoUpClick(Sender: TObject);
procedure btnMakeDirClick(Sender: TObject);
procedure btnRemoveDirClick(Sender: TObject);
procedure btnDeleteFileClick(Sender: TObject);
procedure btnRenameClick(Sender: TObject);
procedure btnAbortClick(Sender: TObject);
procedure btnDownloadClick(Sender: TObject);
procedure btnUploadClick(Sender: TObject);
procedure clFTPDirectoryListing(Sender: TObject;
AFileInfo: TclFtpFileInfo; const Source: String);
procedure clFTPReceiveResponse(Sender: TObject; AList: TStrings);
procedure clFTPProgress(Sender: TObject; ABytesProceed,
ATotalBytes: Integer);
procedure clFTPSendCommand(Sender: TObject; const AText: String);
procedure FormDestroy(Sender: TObject);
private
procedure UpdateStatus;
procedure DoOpenDir(const ADir: string);
procedure FillDirList;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
{ TMainForm }
procedure TMainForm.UpdateStatus;
const
states: array[Boolean] of string = ('Ftp Clinet', 'Ftp Clinet - Connected');
begin
Caption := states[clFTP.Active];
end;
procedure TMainForm.btnLoginClick(Sender: TObject);
const
transferTypes: array[Boolean] of TclFtpTransferType = (ttBinary, ttAscii);
begin
if clFTP.Active then
begin
ShowMessage('You are already connected. Please click Logout to disconnect.');
Exit;
end;
clFTP.Port := StrToInt(edtPort.Text);
clFTP.Server := edtServer.Text;
clFTP.UserName := edtUser.Text;
clFTP.Password := edtPassword.Text;
clFTP.PassiveMode := cbPassiveMode.Checked;
clFTP.TransferType := transferTypes[cbAsciiMode.Checked];
clFTP.Open();
if (edtStartDir.Text = '') then
begin
edtStartDir.Text := clFTP.CurrentDir;
end;
if (edtStartDir.Text <> '') and (edtStartDir.Text[1] = '/') then
begin
DoOpenDir(edtStartDir.Text);
end;
UpdateStatus();
end;
procedure TMainForm.btnLogoutClick(Sender: TObject);
begin
clFTP.Close();
lbList.Items.Clear();
UpdateStatus();
end;
procedure TMainForm.DoOpenDir(const ADir: string);
var
dir: string;
begin
dir := ADir;
if (Length(dir) > 1) and (dir[1] = '/') and (dir[2] = '/') then
begin
system.Delete(dir, 1, 1);
end;
clFTP.ChangeCurrentDir('/');
clFTP.ChangeCurrentDir(dir);
FillDirList();
end;
procedure TMainForm.FillDirList;
begin
lbList.Items.BeginUpdate();
try
lbList.Items.Clear();
clFTP.DirectoryListing();
finally
lbList.Items.EndUpdate();
end;
lbList.Sorted := False;
lbList.Sorted := True;
end;
procedure TMainForm.btnOpenDirClick(Sender: TObject);
begin
if not clFTP.Active then Exit;
if (lbList.ItemIndex > -1) and
(lbList.Items[lbList.ItemIndex] <> '') and
(lbList.Items[lbList.ItemIndex][1] = '/') then
begin
DoOpenDir(clFTP.CurrentDir + lbList.Items[lbList.ItemIndex]);
end;
end;
procedure TMainForm.btnGoUpClick(Sender: TObject);
begin
if not clFTP.Active then Exit;
clFTP.ChangeToParentDir();
FillDirList();
end;
procedure TMainForm.btnMakeDirClick(Sender: TObject);
var
s: string;
begin
if not clFTP.Active then Exit;
s := TNewDialog.ShowNewDialog('New Dir Name', 'NewName');
if (s <> '') then
begin
clFTP.MakeDir(s);
FillDirList();
end;
end;
procedure TMainForm.btnRemoveDirClick(Sender: TObject);
begin
if not clFTP.Active then Exit;
if (lbList.ItemIndex > -1) and
(lbList.Items[lbList.ItemIndex] <> '') and
(lbList.Items[lbList.ItemIndex][1] = '/') then
begin
if (MessageDlg('Do you wish to delete the ' + lbList.Items[lbList.ItemIndex] + ' directory ?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
clFTP.RemoveDir(clFTP.CurrentDir + lbList.Items[lbList.ItemIndex]);
FillDirList();
end;
end;
end;
procedure TMainForm.btnDeleteFileClick(Sender: TObject);
begin
if not clFTP.Active then Exit;
if (lbList.ItemIndex > -1) and
(lbList.Items[lbList.ItemIndex] <> '') and
(lbList.Items[lbList.ItemIndex][1] <> '/') then
begin
if (MessageDlg('Do you wish to delete the ' + lbList.Items[lbList.ItemIndex] + ' file ?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
clFTP.Delete(lbList.Items[lbList.ItemIndex]);
FillDirList();
end;
end;
end;
procedure TMainForm.btnRenameClick(Sender: TObject);
var
s: string;
begin
if not clFTP.Active then Exit;
if (lbList.ItemIndex > -1) and
(lbList.Items[lbList.ItemIndex] <> '') and
(lbList.Items[lbList.ItemIndex][1] <> '/') then
begin
s := TNewDialog.ShowNewDialog('New File Name', lbList.Items[lbList.ItemIndex]);
if (s <> '') and (s <> lbList.Items[lbList.ItemIndex]) then
begin
clFTP.Rename(lbList.Items[lbList.ItemIndex], s);
FillDirList();
end;
end;
end;
procedure TMainForm.btnAbortClick(Sender: TObject);
begin
if clFTP.Active then
begin
clFTP.Abort();
end;
end;
procedure TMainForm.btnDownloadClick(Sender: TObject);
var
size, position, fileExistsResult: Integer;
stream: TStream;
begin
if not clFTP.Active then Exit;
if (lbList.ItemIndex > -1) and
(lbList.Items[lbList.ItemIndex] <> '') and
(lbList.Items[lbList.ItemIndex][1] <> '/') then
begin
SaveDialog.FileName := lbList.Items[lbList.ItemIndex];
if SaveDialog.Execute() then
begin
size := clFTP.GetFileSize(lbList.Items[lbList.ItemIndex]);
position := 0;
stream := nil;
try
if FileExists(SaveDialog.FileName) then
begin
fileExistsResult := TFileExistsDialog.ShowFileDialog(SaveDialog.FileName);
if (fileExistsResult = mrCancel) then Exit;
if (fileExistsResult = mrYes) then
begin
stream := TFileStream.Create(SaveDialog.FileName, fmCreate);
end else
begin
stream := TFileStream.Create(SaveDialog.FileName, fmOpenReadWrite);
if (size > stream.Size) then
begin
position := stream.Size;
end else
begin
stream.Free();
stream := nil;
stream := TFileStream.Create(SaveDialog.FileName, fmCreate);
end;
end;
end else
begin
stream := TFileStream.Create(SaveDialog.FileName, fmCreate);
end;
ProgressBar.Min := 0;
ProgressBar.Max := size;
ProgressBar.Position := position;
clFTP.GetFile(lbList.Items[lbList.ItemIndex], stream, position, -1);
ShowMessage('Done');
finally
stream.Free();
end;
end;
end;
end;
procedure TMainForm.btnUploadClick(Sender: TObject);
var
position, fileExistsResult: Integer;
stream: TStream;
fileName: string;
begin
if not clFTP.Active then Exit;
if OpenDialog.Execute() then
begin
position := 0;
stream := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
try
fileName := ExtractFileName(OpenDialog.FileName);
if clFTP.FileExists(fileName) then
begin
fileExistsResult := TFileExistsDialog.ShowFileDialog(fileName);
if (fileExistsResult = mrCancel) then Exit;
if (fileExistsResult = mrNo) then
begin
position := clFTP.GetFileSize(fileName);
if (stream.Size <= position) then
begin
position := 0;
end;
end;
end;
ProgressBar.Min := 0;
ProgressBar.Max := stream.Size;
ProgressBar.Position := position;
clFTP.PutFile(fileName, stream, position, -1);
ShowMessage('Done');
finally
stream.Free();
end;
FillDirList();
end;
end;
procedure TMainForm.clFTPDirectoryListing(Sender: TObject;
AFileInfo: TclFtpFileInfo; const Source: String);
const
dirPrefix: array[Boolean] of string = ('', '/');
begin
lbList.Items.Add(dirPrefix[AFileInfo.IsDirectory or AFileInfo.IsLink] + AFileInfo.FileName);
end;
procedure TMainForm.clFTPSendCommand(Sender: TObject; const AText: String);
begin
memLog.Lines.Add(Trim(AText));
end;
procedure TMainForm.clFTPReceiveResponse(Sender: TObject; AList: TStrings);
begin
memLog.Lines.AddStrings(AList);
end;
procedure TMainForm.clFTPProgress(Sender: TObject; ABytesProceed,
ATotalBytes: Integer);
begin
ProgressBar.Position := ABytesProceed;
ProgressBar.Max := ATotalBytes;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
clFTP.Close();
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -