📄 ftpsrv.pas
字号:
property OnValidateGet : TFtpSrvValidateXferEvent
read FOnValidateGet
write FOnValidateGet;
property OnStorDataAvailable : TFtpSrvDataAvailableEvent
read FOnStorDataAvailable
write FOnStorDataAvailable;
property OnGetUniqueFileName : TFtpSrvGetUniqueFileNameEvent
read FOnGetUniqueFileName
write FOnGetUniqueFileName;
property OnGetProcessing : TFtpSrvGetProcessingEvent
read FOnGetProcessing
write FOnGetProcessing;
property OnBuildFilePath : TFtpSrvBuildFilePathEvent
read FOnBuildFilePath
write FOnBuildFilePath;
property OnValidateMfmt : TFtpSrvValidateXferEvent { angus V1.39 }
read FOnValidateMfmt
write FOnValidateMfmt;
property OnCalculateMd5 : TFtpSrvCalculateMd5Event { angus V1.39 }
read FOnCalculateMd5
write FOnCalculateMd5;
end;
procedure Register;
implementation
const
msgDftBanner = '220 ICS FTP Server ready.';
msgTooMuchClients = '421 Too many users connected.';
msgCmdUnknown = '500 ''%s'': command not understood.';
msgLoginFailed = '530 Login incorrect.';
msgNotLogged = '530 Please login with USER and PASS.';
msgNoUser = '503 Login with USER first.';
msgLogged = '230 User %s logged in.';
msgPassRequired = '331 Password required for %s.';
msgCWDSuccess = '250 CWD command successful. "%s" is current directory.';
msgCWDFailed = '501 CWD failed. %s';
msgPWDSuccess = '257 "%s" is current directory.';
msgQuit = '221 Goodbye.';
msgPortSuccess = '200 Port command successful.';
msgPortFailed = '501 Invalid PORT command.';
msgStorDisabled = '501 Permission Denied'; {'500 Cannot STOR.';}
msgStorSuccess = '150 Opening data connection for %s.';
msgStorFailed = '501 Cannot STOR. %s';
msgStorAborted = '426 Connection closed; %s.';
msgStorOk = '226 File received ok';
{ msgStorOk = '226-Multiple lines answer'#13#10' Test'#13#10#13#10'226 File received OK'; }
msgStorError = '426 Connection closed; transfer aborted. Error #%d';
msgRetrDisabled = '500 Cannot RETR.';
msgRetrSuccess = '150 Opening data connection for %s.';
msgRetrFailed = '501 Cannot RETR. %s';
msgRetrAborted = '426 Connection closed; %s.';
msgRetrOk = '226 File sent ok';
msgRetrError = '426 Connection closed; transfer aborted. Error #%d';
msgSystem = '215 UNIX Type: L8 Internet Component Suite';
msgDirOpen = '150 Opening data connection for directory list.';
msgDirFailed = '451 Failed: %s.';
msgTypeOk = '200 Type set to %s.';
msgTypeFailed = '500 ''TYPE %s'': command not understood.';
msgDeleNotExists = '550 ''%s'': no such file or directory.';
msgDeleOk = '250 File ''%s'' deleted.';
msgDeleFailed = '450 File ''%s'' can''t be deleted.';
msgDeleSyntax = '501 Syntax error in parameter.';
msgDeleDisabled = '550 Cannot delete.';
msgRnfrNotExists = '550 ''%s'': no such file or directory.';
msgRnfrSyntax = '501 Syntax error is parameter.';
msgRnfrOk = '350 File exists, ready for destination name.';
msgRnFrDisabled = '500 Cannot RNFR.';
msgRntoNotExists = '550 ''%s'': no such file or directory.';
msgRntoAlready = '553 ''%s'': file already exists.';
msgRntoOk = '250 File ''%s'' renamed to ''%s''.';
msgRntoFailed = '450 File ''%s'' can''t be renamed.';
msgRntoSyntax = '501 Syntax error in parameter.';
msgRnToDisabled = '500 Cannot RNTO.';
msgMkdOk = '257 ''%s'': directory created.';
msgMkdAlready = '550 ''%s'': file or directory already exists.';
msgMkdFailed = '550 ''%s'': can''t create directory.';
msgMkdSyntax = '501 Syntax error in parameter.';
msgRmdOk = '250 ''%s'': directory removed.';
msgRmdNotExists = '550 ''%s'': no such directory.';
msgRmdFailed = '550 ''%s'': can''t remove directory.';
msgRmdDisabled = '500 Cannot remove directory.';
msgRmdSyntax = '501 Syntax error in parameter.';
msgNoopOk = '200 Ok. Parameter was ''%s''.';
msgAborOk = '225 ABOR command successful.';
msgPasvLocal = '227 Entering Passive Mode (127,0,0,1,%d,%d).';
msgPasvRemote = '227 Entering Passive Mode (%d,%d,%d,%d,%d,%d).';
msgPasvExcept = '500 PASV exception: ''%s''.';
msgSizeOk = '213 %d';
msgSizeDisabled = '501 Permission Denied';
msgSizeFailed = '550 Command failed: %s.';
msgSizeSyntax = '501 Syntax error in parameter.';
msgRestOk = '350 REST supported. Ready to resume at byte offset %d.';
msgRestZero = '501 Required byte offset parameter bad or missing.';
msgRestFailed = '501 Syntax error in parameter: %s.';
msgAppeFailed = '550 APPE failed.';
msgAppeSuccess = '150 Opening data connection for %s (append).';
msgAppeDisabled = '500 Cannot APPE.';
msgAppeAborted = '426 Connection closed; %s.';
msgAppeOk = '226 File received ok';
msgAppeError = '426 Connection closed; transfer aborted. Error #%d';
msgAppeReady = '150 APPE supported. Ready to append file "%s" at offset %d.';
msgStruOk = '200 Ok. STRU parameter ''%s'' ignored.';
msgMdtmOk = '213 %s';
msgMdtmFailed = '550 %s';
msgMdtmSyntax = '501 Syntax error in MDTM/MFMT parameter.';
msgMdtmNotExists = '550 ''%s'': no such file or directory.';
msgModeOK = '200 MODE Ok';
msgModeSyntax = '501 Missing argument for MODE';
msgModeNotS = '502 MODE other than S not supported';
msgOverflow = '500 Command too long';
msgStouOk = '250 ''%s'': file created.';
msgStouSuccess = msgStorSuccess;
msgStouFailed = '501 Cannot STOU. %s';
msgStouAborted = msgStorAborted;
msgStouError = msgStorError;
msgFeatFollows = '211-Extensions supported:';
msgFeatFollowDone = '211 END';
msgFeatFailed = '211 No-Features';
msgMdtmChangeOK = '253 Date/time changed OK'; { angus V1.38 }
msgMfmtChangeOK = '213 Date/time changed OK'; { angus V1.39 }
msgMdtmChangeFail = '550 MDTM/MFMT cannot change date/time on this server'; { angus V1.38 }
msgCWDNoDir = '550 CWD Failed to change directory to %s'; { angus V1.38 }
msgMlstFollows = '250-Listing '; { angus V1.38 }
msgMlstFollowDone = '250 END'; { angus V1.38 }
msgMlstNotExists = '550 ''%s'': no such file or directory.'; { angus V1.38 }
msgMd5NotFound = '550 ''%s'': no such file.'; { angus V1.39 }
msgMd5Failed = '550 MD5 SUM failed : ''%s''.'; { angus V1.39 }
msgMd5Ok = '251 "%s" %s'; { angus V1.39 }
function SlashesToBackSlashes(const S : String) : String; forward;
function BackSlashesToSlashes(const S : String) : String; forward;
{ function BuildFilePath(const Directory : String; serge le 5/10/2002
FileName : String) : String; forward; }
var
ThisYear, ThisMonth, ThisDay : Word;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure Register;
begin
RegisterComponents('FPiette', [TFtpServer]);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{$IFDEF VER80}
procedure SetLength(var S: String; NewLength: Integer);
begin
S[0] := chr(NewLength);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TrimRight(Str : String) : String;
var
i : Integer;
begin
i := Length(Str);
while (i > 0) and (Str[i] = ' ') do
i := i - 1;
Result := Copy(Str, 1, i);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TrimLeft(Str : String) : String;
var
i : Integer;
begin
if Str[1] <> ' ' then
Result := Str
else begin
i := 1;
while (i <= Length(Str)) and (Str[i] = ' ') do
i := i + 1;
Result := Copy(Str, i, Length(Str) - i + 1);
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function Trim(Str : String) : String;
begin
Result := TrimLeft(TrimRight(Str));
end;
{$ENDIF}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function GetFileSize(FileName : String) : LongInt;
var
SR : TSearchRec;
begin
{$IFNDEF VER80}{$WARNINGS OFF}{$ENDIF}
if FindFirst(FileName, faReadOnly or faHidden or
faSysFile or faArchive, SR) = 0 then
Result := SR.Size
else
Result := -1;
FindClose(SR);
{$IFNDEF VER80}{$WARNINGS ON}{$ENDIF}
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function DirExists(Dir : String) : Boolean;
var
F : TSearchRec;
begin
if Length(Dir) >= 2 then begin { angus V1.38 strip trailing \ }
if Dir[Length(Dir)] = '\' then
Dir := Copy(Dir, 1, Length(Dir) - 1);
end;
Result := (FindFirst(Dir, faDirectory + faHidden, F) = 0);
FindClose(F);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function atosi(value : String) : Integer; { angus V1.38 signed integer }
var
i, j : Integer;
begin
Result := 0;
i := 1;
while (i <= Length(Value)) and (Value[i] = ' ') do
i := i + 1;
j := i;
while (i <= Length(Value)) and (Value[i] in ['+', '-']) do
i := i + 1;
while (i <= Length(Value)) and (Value[i] >= '0') and (Value[i] <= '9')do begin
Result := Result * 10 + ord(Value[i]) - ord('0');
i := i + 1;
end;
if j < Length(Value) then begin
if value[j] = '-' then
Result := -Result;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TFtpServer.Create(AOwner: TComponent);
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -