2011-12-24 5 views
0

FTPClient을 사용하여 서버에서 SDCard로 파일을 복사 할 수있는 Android 애플리케이션을 만들고 있습니다. 나는 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

+0

코드를 편집했습니다. 확인하십시오. – user1078760

+0

흠, 어쩌면 u는 ftpclient 객체에 대한 소켓 타임 아웃을 설정할 수 있습니다. –

답변

0

시도를 재귀 테스트를 제거 할 경우 경우 하나의 디렉토리에 대한 작동합니다. 당신이 그런 식으로 FTPClient을 사용할 수 있는지 확실하지 않습니다.

그런데 재귀 호출에서는 changeWorkingDirectory()이 작동하지 않는 파일 이름을 전달하고 있습니다. 루프에서 client.changeWorkingDirectory(directory);도 제거해야합니다. 루프를하기 전에 한 번 수행하면됩니다.

+0

제발, 말해줘요, 제게 파일 트리를 보여주는 코드를 고칠 수 있습니까? 내 코드가 작동하지 않는다. 나는 그것을 보지 못했다. – user1078760

+0

나는 당신의 권고안을 작성했으나 이제는 응용 프로그램이 더 오랫동안 작동하지만 여전히 SocketException을 만듭니다. – user1078760

+0

@ user1078760 : ProtocolCommandListener를 추가하여 자세한 로깅 기능을 설정하십시오 :'client.addProtocolCommandListener (new PrintCommandListener (new PrintWriter (System.out)))); '. 어쩌면 거기에 문제가있는 것 같습니다. – Kai