如何修复FTPClient的异常?

时间:2011-12-24 15:11:36

标签: java android ftp-client apache-commons-net

我正在制作一个Android应用程序,可以使用FTPClient将文件从服务器复制到SDCard。我使用apache commons库中的FTPClient类。但是服务器包含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());
        }

1 个答案:

答案 0 :(得分:0)

尝试删除递归并测试是否适用于一个目录。我不确定你是否可以这样使用FTPClient

顺便说一下,在递归调用中,您传递的文件名changeWorkingDirectory()将不起作用。您还应该从循环中删除client.changeWorkingDirectory(directory);。在循环之前执行此操作就足够了。