FTPClient在有文件时显示空文件夹

时间:2015-06-24 14:28:03

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

我使用Apache Commons net FTPClient登录并从FTP服务器读取文件。我设法登录,我可以看到它成功登录,因为它显示了标题字符串中的工作目录路径。但是,当我使用listFiles()时,它没有显示任何文件。 (我也尝试过使用listDirectories()listNames(),但没有成功) 以下是一个片段:

try {
        client.connect(ftpHost);
    } /*catch (SocketException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }*/ catch (IOException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }


    String header ="";
    InputStream stream=null;
    BufferedReader reader=null;
    try{
        client.login(ftpUser, ftpPass);
        client.changeWorkingDirectory(targetWorkingDir);
        header = client.printWorkingDirectory();
        //client.setFileType(FTP.BINARY_FILE_TYPE);
        for(int i=0; i<client.listFiles().length;i++){
            header+=client.listFiles()[i].getName() +"\n";
        }

    }
    catch (IOException ex){
        ex.printStackTrace();
        header="ERROR 1: " + ex.getMessage();
        for(int i=0;i<ex.getStackTrace().length;i++){
            header += "\n" + ex.getStackTrace()[i];
        }
    }
    catch(NullPointerException e){
        header = "ERROR 2: "+ e.getMessage()+"\n";
        for(int i=0;i<e.getStackTrace().length;i++){
            header+= e.getStackTrace()[i] + "\n";
        }
    }
    finally{
        if(reader!=null){
            try{reader.close();}catch(IOException e){e.printStackTrace();}
            try{stream.close();}catch(IOException e){e.printStackTrace();}
        }
    }

我也试过用这样的东西来读取文件:

try {
    stream = ftpClient.retrieveFileStream("klasa.csv");
    reader = new BufferedReader(new InputStreamReader(stream));
    header = reader.readLine();
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore){}
}

在这两种情况下,我都非常确定我在正确的目录中,并确保我的文件通过FileZilla存在,但客户端似乎无法读取任何文件。< / p>

1 个答案:

答案 0 :(得分:0)

尝试避免在循环中调用listFiles()。每个呼叫将执行整个FTP LIST命令序列,因此最终,您将向每个呼叫添加不必要的流量。

您可以先尝试简化程序,如下所示:

private static  void ftpTest() {
    FTPClient f = new FTPClient();
    try {
        f.connect("{UOUR FTP SERVER}");
        f.login("{USER}", "{PASSWORD}");
        FTPFile[] files = f.listFiles(".");
        for (FTPFile fi: files) {
            System.out.printf("f%s\n", fi.getName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果该程序不会为您提供服务器根目录中的文件列表,则可以尝试比较FileZilla FTP选项(尤其是PASSIVE / ACTIVE模式):https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode()

如果仍然不能解决问题,您可以尝试使用WireShark或tcpdump嗅探网络流量,并将设置的命令与FTP服务器进行比较。