TIdFTP.DirectoryListingで「No IdFTPListParse classes have been registered.」の例外が発生するときの対処方法

C++Builder 2009にはIndy10が付属しています。
このIndy10のコンポーネントの一つであるTIdFTPを使い、FTPサーバのファイルの一覧を取得したかったのですが…

次のコードを実行すると、例外が発生します。

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!

ヘルプをよく読むと、解説があります。

The Indy library recognizes these defacto standards, and makes provisions for the IETF draft standards. TIdFTP provides the capabilitiy to parse the various formats for the textual content in the ListResult property into a structured representation of the directory stored in the DirectoryListing property. At the present time, Indy offers parsers for 30 different host-specific directory listing formats. Additional parsers are offered as new directory listing formats are encountered and codified. Use the IdAllFTPListParser.pas unit to include and register the known directory listing parsers for the Indy library.

要するに、「IdAllFTPListParser.pasをincludeしてください」ということです。

そこで、ソースコードに次の行を追加することにしました。

#include <IdAllFTPListParsers.hpp>

ところが、これでも状況は変わりません。

検索エンジンで調べてみると、同じような問題で困っている人が見つかりました。

For some reason, IdFTP1->DirectoryListing->Count is always 0.

Problem using TIdFTP in C++ Builder 2007. List() doesn’t work

環境がC++Builder 2007のためでしょうか、現象が多少異なります。
ですが、同じような原因だと考えられます。

次のようなアドバイスがあります。

You have to include the appropriate IdFTPListParse…hpp header files for the specific parser(s) that you want to use. Or alternatively include the IdAllFTPListParsers.hpp header file to enable them all.

これはヘルプに記載されている方法と同じで、私も試した方法です。
案の定、この方法に従っても、問題は解決していません。

質問者は、最新版のIndyをインストールし直したようですが、それでも状況はいっこうに改善せず。
結局、問題は解決していないようです。

TIdFTP.DirectoryListingはC++Builderでは使用できないのかも。
と半分諦めつつ試行錯誤していると、解決策が見つかりました。

わかってしまえば簡単なことですが、でも、わからずに困っている人がたくさんいるのではないでしょうか。

その解決策ですが、次の行を追加するだけです。

#pragma link "IdAllFTPListParsers"

これでうまくいきます。

追記
TIdFTP.DirectoryListingの使い方をまとめました。

コメント

  1. Delphi2010ですが、同じ現象で半日悩んでました。
    ここのサイトにたどり着いたおかげで解決です。
    ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください