- PR -

org.apache.commons.net.ftp.FTPClientのlistFileメソッドについて

投稿者投稿内容
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-08-13 16:07
いつも世話になっております。

現在、Jakarta-Commons NetのFTP関連のクラスがどのようなものなのかを確かめてみたく、
以下のような簡単なプログラムを作成しております。

ログイン時のディレクトリ内のファイル一覧情報を取得したいのですが、
リストのサイズが常に0になり、ファイル情報を取得出来ません。
FTPサーバにはファイルを数個置いているにもかかわらずです。

FTPサーバには接続できており、
ファイルのダウンロードやアップロードに関してはうまくいっております。

原因が全く予想出来ない為、確認すべき点等、ご教授頂きたい次第であります。
クライアント側の環境は「Windows2000 」,サーバー側の環境は、「Solaris」です。

コード:
import java.io.*;
import java.net.SocketException;
import org.apache.commons.net.ftp.*;

public class FtpTest {
    public static void main(String[] args) throws Exception{
        FTPClient client = new FTPClient();
        try {
            System.out.println("開始");
            client.setDefaultPort(21);
            client.connect("XXX.XXX.XXX.XXX");  // FTPサーバーのIPアドレス
            client.login("user", "pass");       // FTPサーバーのID,パスワード
            FTPFile[] list = client.listFiles();
            for (int i=0; i<list.length; i++) {
                String name = list[i].getName();
                String group = list[i].getGroup();
                System.out.println("group : "+group);
                System.out.println("name  : "+name);
            }
        }
        catch (SocketException e) {
            throw e;
        }
        catch (IOException e) {
            throw e;
        }
        finally {
            if (client != null && client.isConnected()) {
                try {
                    client.logout();
                    client.disconnect();
                }
                catch (IOException e) {
                }
            }
            System.out.println("終了");
        }
  }
}



以上、宜しくお願い致します。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-13 16:36
FTPClient#listFilesのAPIドキュメントを見る限り、ファイル数ゼロの場合はnullを返す
とあるので、要素数ゼロの配列が返ってくるとすればあきらかにバグでしょう。
会社員
ベテラン
会議室デビュー日: 2003/01/21
投稿数: 50
投稿日時: 2004-08-13 16:39
Commons Netのバージョンを書きましょう。

http://www.jajakarta.org/

Commons Net 1.2.2 リリース
FTPClient#listFiles()が正常に動作しないバグが修正されています。(2004/06/26)
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-08-13 16:55
>会社員さん
申し訳ございませんでした。
Commons Netのバージョンは、Commons Net 1.2.2です。

>ukさん
>要素数ゼロの配列が返ってくるとすればあきらかにバグでしょう。
修正されているはずの1.2.2でも正常に動かない、という事はやはりバグなのでしょうか・・・。
あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-08-13 17:39
以前commons-netの前身、oroincのNetComponentsを使用した際に、
FTP環境が日本語だと正しくファイルリストが取得できない、
という事態に遭遇したことがありました。
commons-net1.2.2のファイルパーサーを見ても
日本語に対応してはいないようですので、
その辺りが原因かもしれません。

解決方法としては、サーバーの設定を変えることが出来るのであればそれが手っ取り早いかもしれません。
[参照] http://www.nsug.or.jp/readme/no27/27FAQ.html#Q2
サーバーの設定がかえられないのであれば・・・パーサーを実装するなどの処置が必要かもしれません。
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-08-13 18:55
>あいつーさん
サーバーの設定を変える事で再度試してみましたが、ファイルリストは取得出来ませんでした。
commons-net1.2.2のファイルパーサーとは、
org.apache.commons.net.ftp.parser内のクラスの事で宜しいでしょうか?

>日本語に対応してはいないようですので
これは、例えば月の表示が、「日本語の場合:1月 英語の場合 :Jun」のようになっており、
パーサー側では、(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)のように、
英語で記述されている為、日本語環境ではうまく解析されない、という事で宜しいでしょうか?

>パーサーを実装
これは、上記のような言語(国?)依存の部分を、日本語用としたものを作成するという事でしょうか?

非常に難しい話になってきました。。
最初は、FTPサーバー側のファイルの更新日付を取得したい、と思っただけだったんですが・・。
簡単な方法はないでしょうか?
会社員
ベテラン
会議室デビュー日: 2003/01/21
投稿数: 50
投稿日時: 2004-08-13 19:17
Solarisのftpdは何を使ってますか?
wu-ftpdの場合、lsが動作しない設定かもしれません。
ftpコマンドでls等動作はしますか?
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-08-13 20:04
| 最初は、FTPサーバー側のファイルの更新日付を取得したい、と思っただけだったん
| ですが・・。
| 簡単な方法はないでしょうか?

 簡単な方法はないと思います。なぜ、簡単にできないかというのは、
過去からの贈り物「FTP〜後編」
http://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html
の「●LIST ファイル/ディレクトリ名」の項を見ると良いでしょう。

 なお、Commons NET をちょっと調べて(ソースを見て、さらに
Packetyzer 3.0.1 でパケットキャプチャ)みましたところ、
SYST コマンドを発行して、その結果を見て FTPFileEntryParser の
実装クラスを決定(1)。(DefaultFTPFileEntryParserFactory)
 FTPClient#listFiles() メソッドの実行では、FTP Protocol でいうところの
LIST コマンドを発行し、それを (1) で作成した FtpFileEntryParser を使って
解釈しています。
 ftpクライアント側で対処するなら、ここらへんの仕組みを使えばよいでしょう。

 また、ftpサーバの設定を変えたり、ftpサーバプログラム自体を他のものに
変えても良いのであれば、それが一番簡単でしょう。

スキルアップ/キャリアアップ(JOB@IT)