Top / Programming / C++Builder / Indy10でTIdFTP.DirectoryListingを使用する(C++Builder2009)

Indy10でTIdFTP.DirectoryListingを使用する(C++Builder2009)

C++ Builder 2009に付属のTIdFTPを使って、ファイル一覧を取得しようとすると

IdFTP1->Host = EditHost->Text; //サーバ名
IdFTP1->Username = EditUser->Text; //ユーザ名
IdFTP1->Password = EditPassword->Text; //パスワード
IdFTP1->Port = EditPort->Text.ToInt(); //ポート番号
IdFTP1->Connect(); //接続
//ファイルの一覧を取得
IdFTP1->List();
TIdFTPListItems* items = IdFTP1->DirectoryListing; //ここで例外が発生

次のエラーが発生する場合、

No IdFTPListParse classes have been registered. Check your uses clause!

ソースコードに次の行を追加してください。

#pragma link "IdAllFTPListParsers"

詳細はヘルプのTIdFTPに説明があります。(英語ですが)

簡単に説明すると、ファイル一覧の書式はサーバによって異なります。
そこでIndy10では、書式を解析する機能をプラグイン形式で追加できるようになりました。
初期値ではこの解析機能が設定されていないため、TIdFTP.DirectoryListingを実行するとエラーになります。
「#pragma link "IdAllFTPListParsers"」を追加することによって、Indyが用意している解析機能が使用できる状態になります。
ということだと思います。

サンプルコード

FTP接続を行いファイル一覧を取得するプログラムです。

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdAllFTPListParsers"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  IdFTP1->Host = EditHost->Text; //サーバ名
  IdFTP1->Username = EditUser->Text; //ユーザ名
  IdFTP1->Password = EditPassword->Text; //パスワード
  IdFTP1->Port = EditPort->Text.ToInt(); //ポート番号
  IdFTP1->Connect(); //接続

  //ファイルの一覧を取得
  IdFTP1->List();
  TIdFTPListItems* items = IdFTP1->DirectoryListing;

  //リストビューに表示する
  ListView1->Items->Clear();
  ListView1->Items->BeginUpdate();
  for (int i = 0; i < items->Count; ++i)
  {
    TIdFTPListItem* ftpItem = items->Items[i];
    TListItem* listItem = ListView1->Items->Add();
    //ファイル名
    listItem->Caption = ftpItem->FileName;
    //日付
    listItem->SubItems->Add(FormatDateTime("yyyy/mm/dd hh:nn:ss", ftpItem->ModifiedDate));
    if (ftpItem->ItemType == ditDirectory) { //ディレクトリの時
      listItem->SubItems->Add("<DIR>");
    } else {
      //サイズ
      listItem->SubItems->Add(IntToStr(ftpItem->Size));
    }
    //属性
    listItem->SubItems->Add(ftpItem->PermissionDisplay);
  }
  ListView1->Items->EndUpdate();

  IdFTP1->Disconnect(); //切断
}
//---------------------------------------------------------------------------