⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpmisc.pas

📁 Monster FTP Client 强大的ftp客户控件,支持Proxy等
💻 PAS
字号:
unit FtpMisc;

interface

uses SysUtils, Windows;

{$I mftp.inc}

{$ifdef OPTIMIZATION}
const
  SumMonthDays: array [Boolean] of TDayTable =
     ((0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334),
     (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335));
{$endif}

function BuildFTPTopURL(Server: String; Port: Integer; Username, Password: String): String;

function DOSName2UnixName(S: String): String;
function FormatMTime(S: String): String;
function FormatNTime(S: String): String;
function FormatNTTime(D, T: String): String;
function GetTempFilename: String;
function UnformatInteger(S: String): Integer;

{$ifdef COMPATIBLE}
function FormatInteger(I: Integer): String;
function FormatIntegerStr(S: String): String;
{$endif}

{$ifdef OPTIMIZATION}
function optimizedAnsiCompareText(const S1, S2: String): Integer;
function optimizedEncodeDate(Year, Month, Day: Integer): Integer;
procedure optimizedDecodeDate(Date: TDateTime; var Year, Month, Day: Word);
{$endif}

function GetWindowsDirectory: String;
function IsNT: Boolean;

implementation

var Temp, CurrentYear: Word;
    TempDir, WinDir, CYS: String;
    PS: PChar;
    OSInfo: OSVERSIONINFO;
    NTFlag: Boolean;

function BuildFTPTopURL;
begin
   Result := 'ftp://';

   if (not (LowerCase(Username) = 'anonymous')) and (not (LowerCase(Username) = 'ftp')) then
      Result := Result + Username + ':' + Password + '@';

   Result := Result + Server;
   if Port <> 21 then Result := Result + ':' + IntToStr(Port);
end;

function DOSName2UnixName;
begin
   if S[1] = '/' then
   begin
      Result := Copy(S, 4, 999);
   end
   else
   begin
      Result := Copy(S, 3, 999);

      Temp := Pos('\', Result);
      while Temp <> 0 do
      begin
         Result[Temp] := '/';
         Temp := Pos('\', Result);
      end;
   end;
end;

function FormatMTime;
var  P: Integer;
     TS: TTimeStamp;
     TD: TDateTime;
begin
   try
      P := StrToInt(S);
      TS.Time := (P mod 86400) * 1000;
      TS.Date := P div 86400 + 719163;
      TD := TimeStampToDateTime(TS);
      Result := FormatDateTime('mm/dd/yy hh:mm', TD);
   except
      Result := DefaultDateTime;
   end;
end;

function FormatNTime;
var Year, Month, Day: String;
    Times: String;
    I: Integer;
begin
   case S[1] of
      'J':
         if S[2] = 'a' then
            Month := '1'
         else
            if S[3] = 'n' then
               Month := '6'
            else
               Month := '7';
      'F':
         Month := '2';
      'M':
         if S[3] = 'r' then
            Month := '3'
         else
            Month := '5';
      'A':
         if S[2] = 'p' then
            Month := '4'
         else
            Month := '8';
      'S':
         Month := '9';
      'O':
         Month := '10';
      'N':
         Month := '11';
      'D':
         Month := '12';
   end;

   I := Pos(' ', S);
   Delete(S, 1, I);
   while S[1] = ' ' do Delete(S, 1, 1);
   Day := Trim(Copy(S, 1, 2));
   if Length(Day) = 1 then Day := Day;

   if S[3] = ' ' then
      Delete(S, 1, 3)
   else
      Delete(S, 1, 2);

   I := Pos(':', S);
   if I = 0 then
   begin
      Year := Trim(S);
      Delete(Year, 1, 2);
      Times := '12:00 AM';
   end
   else
   begin
      Year := CYS;
      Times := Trim(S);
      if Length(Times) = 5 then
      begin
         I := StrToInt(Copy(Times, 1, 2));
         if I > 12 then
         begin
            Delete(Times, 1, 2);
            Times := IntToStr(I - 12) + Times + ' PM';
         end
         else
         begin
            Times := Times + ' AM';
         end;
         if Times[1] = '0' then Delete(Times, 1, 1);
      end
      else
      begin
         Times := Times + ' AM';
      end;
   end;

   Result := Month + '/' + Day + '/' + Year + ' ' + Times;
end;

function FormatNTTime;
begin
   D[3] := '/';
   D[6] := '/';
   Result := D + ' ' + Copy(T, 1, 5) + ' ' + Copy(T, 6, 2);
end;

function GetTempFilename;
var N: LongWord;
begin
   Randomize;
   repeat
      N := Random(1000000000);
      Result := TempDir + IntToStr(N);
   until (not FileExists(Result));
end;

function UnformatInteger;
var R: String;
    I: Integer;
begin
   for I := 1 to Length(S) do
      if S[I] <> ',' then R := R + S[I];

   Result := StrToInt(R);
end;


{$ifdef COMPATIBLE}
function FormatInteger;
begin
   try
      result := FormatIntegerStr(IntToStr(i));
   except
      result := '';
   end;
end;

function FormatIntegerStr;
var s1: string;
    l, p: integer;
begin
   Result := '';
   s1 := Trim(s);
   l := Length(s1);
   for p := 1 to l do
   begin
      Result := s1[l + 1 - p] + Result;
      if (p mod 3 = 0) and (p <> l) then
         Result := ',' + Result;
   end;
end;
{$endif}


{$ifdef OPTIMIZATION}
function optimizedAnsiCompareText;
asm
   test EAX,EAX
   jne @@nzs1
   test EDX,EDX
   jz @@konec
   dec EAX
   jmp @@konec

@@nzs1:
   test EDX,EDX
   jne @@nzs1s2
   mov EAX,1
   jmp @@konec

@@nzs1s2:
   push -1
   push EDX
   push -1
   push EAX
   push NORM_IGNORECASE
   push LOCALE_USER_DEFAULT
   call CompareString
   sub EAX,2
@@konec:
end;


function optimizedEncodeDate;
asm
   push EBX
   mov EBX, EAX
   imul EAX, EDX, 31
   add EAX, ECX
   mov ECX, EBX
   sub EAX, 396 + DateDelta //31 + 365 + DateDelta
   imul ECX, 365
   add EAX, ECX
   cmp EDX, 3
   jl @@decyear
   imul EDX, 7
   sub EAX, 2
   sar EDX, 4
   sub EAX, EDX
   jmp @@calc
@@decyear:
   dec EBX
@@calc:
   sar EBX, 2
   add EAX, EBX
   imul EBX, 5243
   sar EBX, 17
   sub EAX, EBX
   sar EBX, 2
   add EAX, EBX
   pop EBX
end;

procedure optimizedDecodeDate;
const
   D1 = 365;
   D4 = D1 * 4 + 1;
   D100 = D4 * 25 - 1;
   D400 = D100 * 4 + 1;
var
   Y,M,D: Integer;
begin
   D := Trunc(Date) + (DateDelta - 1);
   if D < 0 then exit;

   asm
      mov EAX, D
      mov ECX, 1
      cmp EAX, 16 * D400
      jb @@za0
      sub EAX, 16 * D400
      add ECX, 16 * 400

   @@za0:
      cmp EAX, 8 * D400
      jb @@za01
      sub EAX, 8 * D400
      add ECX, 8 * 400

   @@za01:
      cmp EAX, 4 * D400
      jb @@za02
      sub EAX, 4 * D400
      add ECX, 4 * 400
   
   @@za02:
      cmp EAX, 2 * D400
      jb @@za03
      sub EAX, 2 * D400
      add ECX, 2 * 400

   @@za03:
      cmp EAX, D400
      jb @@za04
      sub EAX, D400
      add ECX, 400
   @@za04:

      cmp EAX, 2 * D100
      jb @@za1
      sub EAX, 2 * D100
      add ECX, 2 * 100

   @@za1:
      cmp EAX, D100
      jb @@za11
      sub EAX, D100
      add ECX, 100

   @@za11:
      cmp EAX, 16 * D4
      jb @@za3
      sub EAX, 16 * D4
      add ECX, 16 * 4

   @@za3:
      cmp EAX, 8 * D4
      jb @@za31
      sub EAX, 8 * D4
      add ECX, 8 * 4

   @@za31:
      cmp EAX, 4 * D4
      jb @@za32
      sub EAX, 4 * D4
      add ECX, 4 * 4

   @@za32:
      cmp EAX, 2 * D4
      jb @@za33
      sub EAX,2 * D4
      add ECX,2 * 4

   @@za33:
      cmp EAX, D4
      jb @@za34
      sub EAX, D4
      add ECX, 4

      @@za34:
      cmp EAX, 2 * D1
      jb @@za2
      sub EAX, 2 * D1
      add ECX, 2

   @@za2:
      cmp EAX, D1
      jb @@za21
      sub EAX, D1
      inc ECX

   @@za21:
      mov D, EAX
      mov Y, ECX
   end;
  Year:=Y;
  if ((Y and 3)=0) and ((LongWord(Y) mod LongWord(100)<>0) or (LongWord(Y) mod LongWord(400)=0)) then begin
   if D<182 then begin
    if D<91 then begin
     if D<60 then if D<31 then M:=1 else M:=2 else M:=3;
    end else begin
     if D<152 then if D<121 then M:=4 else M:=5 else M:=6;
    end;
   end else begin
    if D<274 then begin
     if D<244 then if D<213 then M:=7 else M:=8 else M:=9;
    end else begin
     if D<335 then if D<305 then M:=10 else M:=11 else M:=12;
    end;
   end;
   Day:=D-SumMonthDays[true,M]+1;
  end else begin
   if D<181 then begin
    if D<90 then begin
     if D<59 then if D<31 then M:=1 else M:=2 else M:=3;
    end else begin
     if D<151 then if D<120 then M:=4 else M:=5 else M:=6;
    end;
   end else begin
    if D<273 then begin
     if D<243 then if D<212 then M:=7 else M:=8 else M:=9;
    end else begin
     if D<334 then if D<304 then M:=10 else M:=11 else M:=12;
    end;
   end;
   Day:=D-SumMonthDays[false,M]+1;
  end;
  Month:=M;
end;

function optimizedDate: TDateTime;
var SystemTime:TSystemTime;
begin
   GetLocalTime(SystemTime);
   with SystemTime do Result := optimizedEncodeDate(wYear,wMonth,wDay);
end;
{$endif}

function GetWindowsDirectory: String;
begin
   Result := WinDir;
end;

function IsNT;
begin
   Result := NTFlag;
end;

initialization
   {$ifdef OPTIMIZATION}
   optimizedDecodeDate(optimizedDate, CurrentYear, Temp, Temp);
   {$else}
   DecodeDate(Date, CurrentYear, Temp, Temp);
   {$endif}
   CYS := IntToStr(CurrentYear);
   Delete(CYS, 1, 2);

   PS := StrAlloc(254);
   Windows.GetWindowsDirectory(PS, 254);
   WinDir := StrPas(PS);
   GetTempPath(254, PS);
   TempDir := StrPas(PS);

   OSInfo.dwOSVersionInfoSize := SizeOf(OSInfo);
   GetVersionEx(OSInfo);
   NTFlag := (OSInfo.dwPlatformId = VER_PLATFORM_WIN32_NT);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -