IndyFTPで、種類と所有者を取得するには?

解決


かんとく  2013-05-16 04:38:01  No: 44554

お世話になっています。

DelphiXE2,Windows7です。

IndyFTPを使って、FTPサーバからファイルの一覧を取得しようとしています。

種類と所有者を取得する方法を知りたいです。

種類とは、ファイルかディレクトリかの区別をしたいです。
※(0:ディレクトリ、1:ファイル)というように判断したいです。

途中まで作ったので、この後どうしたらよいか、よろしくお願いします。

--------------------------------------------------------------

Form1に
Button1
Memo1
IdFTP1
を配置する。

usesに
IdAllFTPListParsers
を追加する。

procedure TForm1.Button1Click(Sender: TObject);
var

  I: Integer;
  S1: String;  //ファイル名
  S2: String;  //更新日時
  S3: String;  //ファイルサイズ
  S4: String;  //種類(0:ディレクトリ、1:ファイル)
  S5: String;  //パーミッション
  S6: String;  //所有者

begin

IdFTP1.Host := '***';  //サーバアドレス
IdFTP1.Username := '***';  //ID
IdFTP1.Password := '***';  //パスワード
IdFTP1.Connect;

  memo1.Text:='';

  try
    IdFTP1.ChangeDir('/');
    IdFTP1.List;

    for I := 0 to IdFTP1.DirectoryListing.Count -1 do
    begin
      S1 := IdFTP1.DirectoryListing.Items[I].FileName;  //ファイル名
      S2 := DateTimeToStr(IdFTP1.DirectoryListing.Items[I].ModifiedDate);  //更新日時
      S3 := inttostr(IdFTP1.DirectoryListing.Items[I].Size);  //ファイルサイズ

      S5 := IdFTP1.DirectoryListing.Items[I].PermissionDisplay;  //パーミッション

      Memo1.Lines.Add(S1 + #9 + S2+ #9 + S3+ #9+ S4 + #9 + S5 + #9 + S6);

    end;

  finally

  end;

IdFTP1.Quit;

end;


山本隆  URL  2013-05-16 07:02:17  No: 44555

ファイルの種類は、TIdFTPListItemのItemTypeプロパティを参照します。
http://www.gesource.jp/weblog/?p=5783

所有者は、TIdFTPListItemのDataプロパティを解析することになるかな。


かんとく  2013-05-18 04:28:40  No: 44556

対応ありがとうございます。

○種類については、わかりました。

      case IdFTP1.DirectoryListing.Items[I].ItemType of
          ditDirectory: S5:='Directory';
          ditFile: S5:= 'File';
          ditSymbolicLink: S5:= 'SymbolicLink';
          ditSymbolicLinkDir: S5:= 'SymbolicLinkDir';
          ditBlockDev: S5:= 'BlockDev';
          ditCharDev: S5:= 'CharDev';
          ditFIFO: S5:= 'FIFO';
          ditSocket: S5:= 'Socket';
      end;

で、変数S5に種類が入りました。

○所有者については、

IdFTP1.DirectoryListing.Items[I].data
を解析すればいい、ということだと思います。

実際に、値を取得してみました。

drwxrwxrwx 4005 1014     1014       151552 May 16 16:29 data
-rw-r--r--    1 1014     1014            8 May 10 14:14 test.txt

のような値を取得できました。

他のFTPソフトでも値を取得してみて、
「1014」
の部分が所有者なのだと思います。
ただ、同じ値が2か所あったり、値と値の間のスペースの数が複数あったりして、これで完璧、という解析の手順がわかりません。
単純に、17文字目〜20文字目が「所有者」ということでよろしいのでしょうか。

よろしくお願いします。


かんとく  2013-05-20 08:24:32  No: 44557

○所有者についてですけど、
別の(FTP)サーバに接続して、
IdFTP1.DirectoryListing.Items[I].data
の値を取得したところ、

modify=20130509144759;perm=flcdmpe;type=dir;unique=812U3368017;UNIX.group=2521;UNIX.mode=0750;UNIX.owner=10181; httpdocs

という結果になりました。

ということは、接続するサーバのFTPソフトによって、dataの値の構造が異なるということになると思います。
そうなると、dataのプロパティの解析するためには、サーバのFTPソフトは何か、を取得して、FTPソフトの種類ごとに、解析の方法を考えないといけない、ということになるのでしょうか。

それとも、何か簡単な(確実な)方法があるのでしょうか。


かんとく  2013-05-26 06:23:13  No: 44558

FTPのことをいろいろ調べたんですが、これで完璧という所有者の取得の方法がわかりませんでした。

山本隆さまに対応していただいて、種類は取得できるようになったので、解決にチェックします。

ありがとうございました。

--------------------------------------------------------------

Form1に
Button1
Memo1
IdFTP1
を配置する。

usesに
IdAllFTPListParsers
を追加する。

procedure TForm1.Button1Click(Sender: TObject);
var

  I: Integer;
  S1: String; //ファイル名
  S2: String; //更新日時
  S3: String; //ファイルサイズ
  S4: String; //種類
  S5: String; //パーミッション

begin

IdFTP1.Host := '***'; //サーバアドレス
IdFTP1.Username := '***'; //ID
IdFTP1.Password := '***'; //パスワード
IdFTP1.Connect;

  memo1.Text:='';

  try
    IdFTP1.ChangeDir('/');
    IdFTP1.List;

    for I := 0 to IdFTP1.DirectoryListing.Count -1 do
    begin
      S1 := IdFTP1.DirectoryListing.Items[I].FileName; //ファイル名
      S2 := DateTimeToStr(IdFTP1.DirectoryListing.Items[I].ModifiedDate); //更新日時
      S3 := inttostr(IdFTP1.DirectoryListing.Items[I].Size); //ファイルサイズ

      case IdFTP1.DirectoryListing.Items[I].ItemType of
          ditDirectory: S4:='Directory';
          ditFile: S4:= 'File';
          ditSymbolicLink: S4:= 'SymbolicLink';
          ditSymbolicLinkDir: S4:= 'SymbolicLinkDir';
          ditBlockDev: S4:= 'BlockDev';
          ditCharDev: S4:= 'CharDev';
          ditFIFO: S4:= 'FIFO';
          ditSocket: S4:= 'Socket';
      end; //種類

      S5 := IdFTP1.DirectoryListing.Items[I].PermissionDisplay; //パーミッション

      Memo1.Lines.Add(S1 + #9 + S2+ #9 + S3+ #9+ S4 + #9 + S5 );

    end;

  finally

  end;

IdFTP1.Quit;

end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加