【问题标题】:FTPClient showing empty folder when it has filesFTPClient 有文件时显示空文件夹
【发布时间】:2015-09-10 19:41:28
【问题描述】:

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

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 确保我的文件在那里,但客户端似乎无法读取任何文件。

【问题讨论】:

  • 应用程序可能是其他用户,没有权限查看文件...
  • 但是应用程序获得了与 FileZilla 相同的用户名和密码,我可以在 FileZilla 中看到这个文件

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


【解决方案1】:

尽量避免在循环中调用 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 选项(特别是被动/主动模式):https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode()

如果没有帮助,您可以尝试使用 WireShark 或 tcpdump 嗅探网络流量,并比较设置到 FTP 服务器的命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 2020-02-03
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多