お世話になっています。
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;
ファイルの種類は、TIdFTPListItemのItemTypeプロパティを参照します。
http://www.gesource.jp/weblog/?p=5783
所有者は、TIdFTPListItemのDataプロパティを解析することになるかな。
対応ありがとうございます。
○種類については、わかりました。
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文字目が「所有者」ということでよろしいのでしょうか。
よろしくお願いします。
○所有者についてですけど、
別の(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ソフトの種類ごとに、解析の方法を考えないといけない、ということになるのでしょうか。
それとも、何か簡単な(確実な)方法があるのでしょうか。
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;
ツイート | ![]() |