0

を使用してサーバーからSDカードにファイルをコピーできるAndroidアプリケーションを作成していますFTPClient。私はFTPClientApacheCommonsライブラリのクラスを使用しています。しかし、サーバーには1000以上のファイルが含まれており、サーバーからファイル名を取得しようとすると、SocketException「接続がリセットされました」というメッセージが表示されます(現時点で25個のファイル名があります)。ライブラリのバージョンは3.0.1です。どうすれば修正できますか?

ファイルを再帰的に取得する関数:

private void getFileNames(String directory, FTPClient client) throws IOException {

    Log.e("directory", "*"+directory+"**********");
    client.changeWorkingDirectory(directory);
    FTPFile[] files=client.listFiles();
    for (FTPFile file:files) {
        client.changeWorkingDirectory(directory);
        if (file.isFile()) {
            ++i;
            Log.e("file", file.getName());
            Toast.makeText(this, String.valueOf(file.getName()), Toast.LENGTH_SHORT).show();
        }
        else {

            if (file.isDirectory()&&(!file.getName().equals("."))&&(!file.getName().equals(".."))) {

                //Log.e("1", file.getLink());
                getFileNames(file.getName(), client);
            }
        }
    }

    Log.e("directory", "**********");
}

FTPClientを作成するためのコード:

   FTPClient client=new FTPClient();
    try {
            client.connect(InetAddress.getByName("ftptestsite.com"));
        boolean result=client.login("ftptest1", "bEWw9eZR");
        //client.completePendingCommand();
        //client.enterLocalPassiveMode();
        client.setDataTimeout(Integer.MAX_VALUE);
        i=0;
        getFileNames("Power Serve", client);
        button.setText(String.valueOf(i));
        //Log.e("size", String.valueOf(client.listFiles("Power_Serve").length));
        //getFileNames(client.listFiles("Power Serve"));
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("SocketException", e.getMessage());
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            Log.e("UnknownHostException", e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("IOException", e.getMessage());
        }
4

1 に答える 1

0

再帰を削除して、1 つのディレクトリで機能するかどうかをテストしてください。そんな使い方できるかFTPClient不安。

ところで、再帰呼び出しでは、ファイル名を渡していますが、これは機能しchangeWorkingDirectory()ません。client.changeWorkingDirectory(directory);また、ループからを削除する必要があります。ループの前にこれを 1 回行うだけで十分です。

于 2011-12-24T15:58:56.420 に答える