📄 ftpcli.pas
字号:
Aug 30, 2004 V2.95 Added option ftpWaitUsingSleep so that WaitUntilReady use
Sleep instead of MsgWaitForMultipleObjects because Angus said he
found a case where it is faster to use Sleep.
Oct 31, 2004 V2.96 Added support for ACCT command.
Thanks to Igor Siticov <support@sicomponents.com> for his code.
Dec 06, 2004 V2.97 In TCustomFtpCli.HandleBackGroundException: Replaced Abort
by AbortAsync. Thanks to Lee Grissom <leegrissom@earthlink.net>
for finding this one.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
unit FtpCli;
{$B-} { Enable partial boolean evaluation }
{$T-} { Untyped pointers }
{$X+} { Enable extended syntax }
{$I ICSDEFS.INC}
{$IFDEF DELPHI6_UP}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN SYMBOL_LIBRARY OFF}
{$WARN SYMBOL_DEPRECATED OFF}
{$ENDIF}
{$IFNDEF VER80} { Not for Delphi 1 }
{$H+} { Use long strings }
{$J+} { Allow typed constant to be modified }
{$ENDIF}
{$IFDEF BCB3_UP}
{$ObjExportAll On}
{$ENDIF}
{_DEFINE TRACE}
interface
uses
Messages,
{$IFDEF USEWINDOWS}
Windows,
{$ELSE}
WinTypes, WinProcs,
{$ENDIF}
SysUtils, Classes,
{$IFNDEF NOFORMS}
Forms, Controls,
{$ENDIF}
{ You must define USE_SSL so that SSL code is included in the component. }
{ To be able to compile the component, you must have the SSL related files }
{ which are _NOT_ freeware. See http://www.overbyte.be for details. }
{$IFDEF USE_SSL}
IcsSSLEAY, IcsLIBEAY,
{$ENDIF}
WSocket,
FtpSrvT; { V2.90 time and date functions }
const
FtpCliVersion = 297;
CopyRight : String = ' TFtpCli (c) 1996-2005 F. Piette V2.97 ';
const
BLOCK_SIZE = 1460; { 1514 - TCP header size }
WM_FTP_REQUEST_DONE = WM_USER + 1;
WM_FTP_SENDDATA = WM_USER + 2;
{$IFDEF VER80}
{ Delphi 1 has a 255 characters string limitation }
FTP_RCV_BUF_SIZE = 255;
{$ELSE}
FTP_RCV_BUF_SIZE = 4096;
{$ENDIF}
type
TFtpOption = (ftpAcceptLF, ftpNoAutoResumeAt, ftpAuthSsl,
ftpWaitUsingSleep);
TFtpOptions = set of TFtpOption;
TFtpExtension = (ftpFeatNone, ftpFeatSize, ftpFeatRest, ftpFeatMDTMYY,
ftpFeatMDTM, ftpFeatMLST, ftpFeatMFMT, ftpFeatMD5);
TFtpExtensions = set of TFtpExtension; { V2.94 which features server supports }
TFtpState = (ftpNotConnected, ftpReady, ftpInternalReady,
ftpDnsLookup, ftpConnected, ftpAbort,
ftpInternalAbort, ftpWaitingBanner, ftpWaitingResponse,
ftpPasvReady);
TFtpRequest = (ftpNone, ftpOpenAsync, ftpUserAsync,
ftpPassAsync, ftpCwdAsync, ftpConnectAsync,
ftpReceiveAsync, ftpDirAsync, ftpLsAsync,
ftpPortAsync, ftpGetAsync, ftpDirectoryAsync,
ftpListAsync, ftpSystemAsync, ftpSystAsync,
ftpQuitAsync, ftpAbortXferAsync,
ftpSizeAsync, ftpPutAsync, ftpAppendAsync,
ftpFileSizeAsync, ftpRqAbort, ftpMkdAsync,
ftpRmdAsync, ftpRenameAsync, ftpDeleAsync,
ftpRenAsync, ftpRenToAsync, ftpRenFromAsync,
ftpDeleteAsync, ftpMkdirAsync, ftpRmdirAsync,
ftpPwdAsync, ftpQuoteAsync, ftpCDupAsync,
ftpDoQuoteAsync, ftpTransmitAsync, ftpTypeSetAsync,
ftpRestAsync, ftpRestGetAsync, ftpRestartGetAsync,
ftpRestPutAsync, ftpRestartPutAsync,
ftpMlsdAsync, ftpFeatAsync, ftpMlstAsync,
ftpMdtmAsync, ftpMdtmyyAsync, ftpAuthSslAsync,
ftpMfmtAsync, ftpMd5Async, ftpAccountAsync);
TFtpFct = (ftpFctNone, ftpFctOpen, ftpFctUser,
ftpFctPass, ftpFctCwd, ftpFctSize,
ftpFctMkd, ftpFctRmd, ftpFctRenFrom,
ftpFctRenTo, ftpFctGet, ftpFctDir,
ftpFctQuit, ftpFctSyst, ftpFctDele,
ftpFctPwd, ftpFctQuote, ftpFctPut,
ftpFctTypeSet, ftpFctRest, ftpFctCDup,
ftpFctLs, ftpFctAppend, ftpFctPort,
ftpFctAbortXfer, ftpFctMlsd, ftpFctFeat,
ftpFctMlst, ftpFctMdtm, ftpFctMdtmyy,
ftpFctAuthSsl, ftpFctMfmt, ftpFctMd5,
ftpFctAcct);
TFtpFctSet = set of TFtpFct;
TFtpShareMode = (ftpShareCompat, ftpShareExclusive,
ftpShareDenyWrite, ftpShareDenyRead,
ftpShareDenyNone);
TFtpDisplayFileMode = (ftpLineByLine, ftpBinary);
TFtpConnectionType = (ftpDirect, ftpProxy, ftpSocks4, ftpSocks4A, ftpSocks5);
TFtpDisplay = procedure(Sender : TObject;
var Msg : String) of object;
TFtpProgress = procedure(Sender : TObject;
Count : LongInt;
var Abort : Boolean) of object;
TFtpCommand = procedure(Sender : TObject;
var Cmd : String) of object;
TFtpRequestDone = procedure(Sender : TObject;
RqType : TFtpRequest;
ErrCode : Word) of object;
TFtpReadyToTransmit = procedure(Sender : TObject;
var bCancel : Boolean) of object;
TFtpNextProc = procedure of object;
FtpException = class(Exception);
TCustomFtpCli = class(TComponent)
protected
FWindowHandle : HWND;
FHostName : String;
FPort : String;
FDataPortRangeStart : DWORD; {JT}
FDataPortRangeEnd : DWORD; {JT}
FLastDataPort : DWORD; {JT}
FLocalAddr : String; {bb}
FUserName : String;
FPassWord : String;
FAccount : String;
FLocalFileName : String;
FHostFileName : String;
FHostDirName : String;
FDnsResult : String;
FType : Char;
FShareMode : Word;
FDisplayFileMode : TFtpDisplayFileMode;
FConnectionType : TFTPConnectionType;
FProxyServer : String;
FProxyPort : String;
FAppendFlag : Boolean;
FDisplayFileFlag : Boolean;
FControlSocket : TWSocket;
FDataSocket : TWSocket;
FStartTime : LongInt;
FStopTime : LongInt;
FState : TFtpState;
FStatusCode : LongInt;
FRequestResult : Integer;
FFctSet : TFtpFctSet;
FFctPrv : TFtpFct;
FHighLevelResult : Integer;
FHighLevelFlag : Boolean;
FRestartFlag : Boolean;
FOptions : TFtpOptions;
FOnDisplay : TFtpDisplay;
FOnDisplayFile : TFtpDisplay;
FOnError : TFtpDisplay;
FOnCommand : TFtpCommand;
FOnResponse : TNotifyEvent;
FOnSessionConnected : TSessionConnected;
FOnSessionClosed : TSessionClosed;
FOnStateChange : TNotifyEvent;
FOnRequestDone : TFtpRequestDone;
FOnProgress : TFtpProgress;
FOnReadyToTransmit : TFtpReadyToTransmit;
FOnBgException : TBgExceptionEvent;
FLocalStream : TStream;
FRequestType : TFtpRequest;
FRequestDoneFlag : Boolean;
FReceiveBuffer : array [0..FTP_RCV_BUF_SIZE - 1] of char;
FReceiveLen : Integer;
FLastResponse : String;
FLastResponseSave : String; { To save FLastResponse when quitting }
FPasvResponse : String; { To fix REST + PASV transfers }
FStatusCodeSave : LongInt; { To save FStatusCode when quitting }
FErrorMessage : String;
FError : Word; { To save Error when data connection closed }
FGetCommand : String;
FConnected : Boolean;
FSendBuffer : array [0..BLOCK_SIZE - 1] of char;
FByteCount : LongInt;
FSizeResult : LongInt;
FDirResult : String;
FResumeAt : LongInt;
FNext : TFtpNextProc;
FWhenConnected : TFtpNextProc;
FDoneAsync : TFtpNextProc;
FOkResponses : array [0..15] of Integer;
FNextRequest : TFtpNextProc;
FServerSaidDone : Boolean;
FFileReceived : Boolean;
FFileSent : Boolean;
FPassive : Boolean;
FEofFlag : Boolean;
FStorAnswerRcvd : Boolean;
FPutSessionOpened : Boolean;
FStreamFlag : Boolean;
FSupportedExtensions : TFtpExtensions; { V2.94 which features server supports }
FMLSTFacts : String; { V2.90 specific new list stuff supported }
FRemFileDT : TDateTime; { V2.90 date/time for MdtmAsync and MdtmYYYYAsync and MfmtAsync }
FRemFacts : String; { V2.90 response to MLST command, facts about remote file }
FLastMultiResponse : String; { V2.90 last command response, may be multiple lines, all with CRLF }
FMd5Result : String; { V2.94 result for MD5 }
procedure SetErrorMessage;
procedure DataSocketGetDataAvailable(Sender: TObject; ErrCode : word);
procedure DataSocketGetSessionConnected(Sender: TObject; ErrCode : word);
procedure DataSocketPutSessionConnected(Sender: TObject; ErrCode : word);
procedure DataSocketGetSessionAvailable(Sender: TObject; ErrCode : word);
procedure DataSocketGetSessionClosed(Sender: TObject; ErrCode : word);
procedure DataSocketPutDataAvailable(Sender: TObject; ErrCode : word);
procedure DataSocketPutDataSent(Sender: TObject; ErrCode : word);
procedure DataSocketPutSessionAvailable(Sender: TObject; ErrCode : word);
procedure DataSocketPutSessionClosed(Sender: TObject; ErrCode : word);
procedure SendCommand(Cmd : String); virtual;
procedure TriggerDisplay(Msg : String); virtual;
procedure TriggerReadyToTransmit(var bCancel : Boolean); virtual;
procedure TriggerDisplayFile(Msg : String); virtual;
procedure TriggerError(Msg: String); virtual;
procedure DisplayLastResponse;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
function Progress : Boolean; virtual;
procedure ControlSocketDnsLookupDone(Sender: TObject; ErrCode: Word);
procedure ControlSocketSessionConnected(Sender: TObject; ErrCode: Word);
procedure ControlSocketDataAvailable(Sender: TObject; ErrCode: Word);
procedure ControlSocketSessionClosed(Sender: TObject; ErrCode: Word);
procedure ControlSocketSslHandshakeDone(Sender: TObject; ErrCode: Word);
procedure TriggerRequestDone(ErrCode: Word);
procedure TriggerStateChange;
procedure StateChange(NewState : TFtpState);
procedure PortAsync; virtual;
procedure DoneQuitAsync;
procedure ExecAsync(RqType : TFtpRequest;
Cmd : String;
OkResponses : array of Word;
DoneAsync : TFtpNextProc);
procedure NextExecAsync;
procedure DoGetAsync(RqType : TFtpRequest);
procedure Next1GetAsync;
procedure Next2GetAsync;
procedure Next3GetAsync;
procedure Next1PutAsync;
procedure Next2PutAsync;
procedure Next3PutAsync;
procedure DoHighLevelAsync;
procedure DoPutAppendAsync;
procedure HighLevelAsync(RqType : TFtpRequest; Fcts : TFtpFctSet);
procedure HandleError(const Msg : String);
function CheckReady : Boolean;
procedure TransfertStats; virtual;
procedure ExtractMoreResults;
procedure SetBinary(Value: Boolean);
function GetBinary: Boolean;
function GetConnected: Boolean;
procedure SetShareMode(newValue: TFtpShareMode);
function GetShareMode: TFtpShareMode;
procedure SetDisplayFileMode(NewValue: TFtpDisplayFileMode);
function GetDisplayFileMode: TFtpDisplayFileMode;
procedure SetConnectionType(NewValue: TFtpConnectionType);
function GetConnectionType: TFtpConnectionType;
procedure SetSocksPassword(NewValue: String);
function GetSocksPassword: String;
procedure SetSocksPort(NewValue: String);
function GetSocksPort: String;
procedure SetSocksServer(NewValue: String);
function GetSocksServer: String;
procedure SetSocksUserCode(NewValue: String);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -