2011-12-24 68 views
0

我正在制作一个Android应用程序,它可以使用FTPClient将文件从服务器复制到SDCard中。我使用Apache公共库中的FTPClient类。但服务器包含1000多个文件,当我尝试从服务器获取文件名时,我得到SocketException:“连接已重置”(此时我有25个文件名)。库的版本是3.0.1。我该如何解决它?如何解决FTPClient的异常?

功能递归获取文件:

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()); 
     } 
+0

请给我们看看代码。 – Kai 2011-12-24 15:21:28

+0

我编辑了代码,请检查它。 – user1078760 2011-12-24 15:36:05

+0

hm,也许你可以设置ftpclient对象的套接字超时 – 2011-12-24 15:36:33

回答

0

尝试删除递归和测试,如果如果一个目录的作品。我不确定你是否可以这样使用FTPClient

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

+0

请告诉我 - 我该如何修复我的代码,它显示了我的文件树?我的代码不起作用,我没有看到它。 – user1078760 2011-12-24 16:21:10

+0

我已经提出你的建议,现在应用程序工作时间更长,但仍然使SocketException – user1078760 2011-12-24 16:46:36

+0

@ user1078760:通过添加一个ProtocolCommandListener:client.addProtocolCommandListener(新的PrintCommandListener(新的 PrintWriter(System.out)))打开详细日志记录。 '。也许你在那里看到一个问题。 – Kai 2011-12-25 09:53:42

相关问题