Question

I have a Problem with commons-net FTPClient. If I download a file from my ftp server wirth retrieveFileStream() it works, but I get the result '150 Opening BINARY mode data connection for ...'. If I call noop() I get '226 Transfer complete' as result. For every following operation I get the result of the prvious operation.

I found out, that FTPClient reads results until end of line, if there are two result lines (as after retrieveFileStream()), I get the second one after the next command. I did a workaround by overriding FTPClient.retrieveFileStream() like this:

public static void main(String[] args){
    try {
        MyFTPClient ftpClient = new MyFTPClient();
        try {
            ftpClient.connect(ftphost, 21);
            if(!ftpClient.login( ftpuser, ftppassword )){
                throw new RuntimeException(ftpClient.getReplyString());
            }
            if(!ftpClient.changeWorkingDirectory("in")){
                throw new RuntimeException(ftpClient.getReplyString());
            }
            FTPFile[] files = ftpClient.listFiles();
            for(FTPFile file: files){
                if(file.getName().startsWith(FILENAME) && (file.getType() == FTPFile.FILE_TYPE)){
                    InputStream in = ftpClient.retrieveFileStream(file.getName());
                    CsvFile csvFile = new CsvFile(in, "ISO-8859-1", ';', "yyyyMMdd", "#.00", Locale.US, false);
                    in.close();
                    in = null;
                    System.out.println(ftpClient.getReplyString());
                    System.out.println(ftpClient.readLine());
                    System.out.println(ftpClient.rnfr(file.getName()));
                    System.out.println(ftpClient.getReplyString());
                    System.out.println(ftpClient.rnto("x" + file.getName()));
                    System.out.println(ftpClient.getReplyString());

                }
            }
            if(!ftpClient.logout()){
                throw new RuntimeException(ftpClient.getReplyString());
            }
        } finally {
            ftpClient.disconnect();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private static class MyFTPClient extends FTPClient{
    public String readLine(){
        try {
            __getReplyNoReport();
        } catch (IOException e) {
        }
        return getReplyString();
    }
}

The call of the method readLine() gets me the additional Line of result.

But is this a bug of FTPClient or is it a problem of my ftp-server? The Problem of that workaround is, that the method blocks, if there is only one line of response.

Thanx for your help

Stephan

Was it helpful?

Solution

Sometimes it helps, reading the manual. A call of completePendingCommand() works

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top