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

📄 ftpindex.pas

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

{Rountines to parse diffrent kinds of index file}
interface

uses Classes, SysUtils, Windows, FtpData;

const
   InpriseID = 'File     Ext     Size   Date     Time   Description';
   KeeperID_1 = 'do not edit by hand!';
   KeeperID_2 = 'keeper';
   KeeperID_3 = '------------------------------------------------------------------------------';
   SimTelID = 'Some files may have been added or deleted since that date.  See';
   WinSiteID_1 = '** WinSite (tm):  The Planet'#39's Largest Software Archive for Windows';
   WinSiteID_2 = '******************************************************************************';

var Buffer: TStringList;

function GetTempIndexFilename: String;

function ParseIndexFile(Filename: String; D, F: TStrings; DI, FI: TMFtpFileInfoList): Boolean;
procedure ParseGeneralIndexFile(D, F: TStrings; DI, FI: TMFtpFileInfoList);
procedure ParseInpriseIndexFile(D, F: TStrings; DI, FI: TMFtpFileInfoList);
procedure ParseKeeperIndexFile(D, F: TStrings; DI, FI: TMFtpFileInfoList);
procedure ParseSimTelIndexFile(D, F: TStrings; DI, FI: TMFtpFileInfoList);
procedure ParseWinSiteIndexFile(D, F: TStrings; DI, FI: TMFtpFileInfoList);

implementation

var PS: PChar;

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

function ParseIndexFile;
begin
   try
      DI.ClearPart(ItemDescription);
      FI.ClearPart(ItemDescription);
      Buffer.LoadFromFile(Filename);
      Result := True;

      if Buffer.Count >= 2 then
      begin
         if Pos(KeeperID_1, Buffer[0]) > 0 then
         begin
            if Pos(KeeperID_2, LowerCase(Buffer[0])) > 0 then
            begin
               ParseKeeperIndexFile(D, F, DI, FI);
               Buffer.Clear;
               Exit;
            end;
         end;

         if Buffer[1] = SimTelID then
         begin
            ParseSimtelIndexFile(D, F, DI, FI);
            Buffer.Clear;
            Exit;
         end;

         if Buffer[1] = WinSiteID_1 then
         begin
            ParseWinSiteIndexFile(D, F, DI, FI);
            Buffer.Clear;
            Exit;
         end;

         if Buffer[2] = InpriseID then         
         begin
            ParseInpriseIndexFile(D, F, DI, FI);
            Buffer.Clear;
            Exit;
         end;
      end;

      ParseGeneralIndexFile(D, F, DI, FI);
      Buffer.Clear;
   except
      Buffer.Clear;
      Result := False;
   end;
end;

procedure ParseGeneralIndexFile;
var S, S1: String;
    i, i1, k: Integer;
begin
   for k := 0 to Buffer.Count - 1 do
   begin
      S := Trim(Buffer[k]);

      if S <> '' then
      begin
         if S[1] = '"' then
         begin
            S[1] := ' ';
            i := Pos('"', S);
         end
         else
         begin
            i := Pos(' ', S);
         end;

         if i > 0 then
         begin
            S1 := Trim(Copy(S, 1, i - 1));
            S := Trim(Copy(S, i + 1, 999));

            i1 := D.IndexOf(S1);
            if i1 >= 0 then DI.Put(i1, ItemDescription, S);
            i1 := F.IndexOf(S1);
            if i1 >= 0 then FI.Put(i1, ItemDescription, S);
         end;
      end;
   end;
end;

procedure ParseInpriseIndexFile;
var S, S1: String;
    i, k: Integer;
begin
   for k := 4 to Buffer.Count - 1 do
   begin
      S := Trim(Copy(Buffer[k], 1, 8)) + '.' + Trim(Copy(Buffer[k], 10, 3));
      S1 := Trim(Copy(Buffer[k], 41, 999));

      i := D.IndexOf(S);
      if i >= 0 then DI.Put(i, ItemDescription, S1);
      i := F.IndexOf(S);
      if i >= 0 then FI.Put(i, ItemDescription, S1);
   end;
end;

procedure ParseKeeperIndexFile;
var S, S1: String;
    i, i1, k, k1: Integer;
begin
   for k1 := 1 to Buffer.Count - 1 do
      if Buffer[k1] = KeeperID_3 then Break;

   for k := k1 + 1 to Buffer.Count - 1 do
   begin
      S := Trim(Buffer[k]);

      if S <> '' then
      begin
         i := Pos(' ', S);

         if i > 0 then
         begin
            S1 := Trim(Copy(S, 1, i - 1));
            S := Trim(Copy(S, i + 1, 999));

            i := Length(S1);
            if S1[i] = '/' then
            begin
               Delete(S1, i, 1);
               i1 := D.IndexOf(S1);
               if i1 >= 0 then DI.Put(i1, ItemDescription, S);
            end
            else
            begin
               i1 := F.IndexOf(S1);
               if i1 >= 0 then FI.Put(i1, ItemDescription, S);
            end;
         end;
      end;
   end;
end;

procedure ParseSimTelIndexFile;
var S, S1: String;
    i, k: Integer;
begin
   for k := 9 to Buffer.Count - 1 do
   begin
      S := Trim(Copy(Buffer[k], 1, 13));
      S1 := Trim(Copy(Buffer[k], 34, 999));

      i := D.IndexOf(S);
      if i >= 0 then DI.Put(i, ItemDescription, S1);
      i := F.IndexOf(S);
      if i >= 0 then FI.Put(i, ItemDescription, S1);
   end;
end;

procedure ParseWinSiteIndexFile;
var S, S1: String;
    i, k: Integer;
begin
   k := 22;
   while k < Buffer.Count - 1 do
   begin
      if Buffer[k] = WinSiteID_2 then Exit;

      S := Trim(Copy(Buffer[k], 1, 13));
      S1 := Trim(Buffer[k + 1]);

      i := D.IndexOf(S);
      if i >= 0 then DI.Put(i, ItemDescription, S1);
      i := F.IndexOf(S);
      if i >= 0 then FI.Put(i, ItemDescription, S1);

      Inc(k, 2);
   end;
end;

initialization
   PS := StrAlloc(254);
   GetTempPath(254, PS);

   Buffer := TStringList.Create;

finalization
   Buffer.Free;
end.

⌨️ 快捷键说明

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