printWorkingDirectory() 给出空值

printWorkingDirectory() gives null

我在下面编写了一段代码,用于将 Excel 条记录插入数据库 table。 Excel 文件在 ftp 服务器上。 基本上我首先更改目录 abd 检索文件流。

readExcel(String test, String filename) {
    client.changeWorkingDirectory("/"+test);
    is =  client.retrieveFileStream(filename");
    //do the processing
}

以上代码一次运行良好。但是现在我想循环使用上面的代码并上传多个文件。我这样做了,发现只有第一个文件得到了正确处理,第二个文件卡在 client.retrieveFileStream() 方法上方。 在我对循环中的第一个文件在 changeWorkingDirectory() 之前和之后使用 printWorkingDirectory() 方法之后,它在前后给出了正确的目录。但是第二次在循环中它给出了 null 两次并且代码之前被卡住了。 retrieveFileStream().

根据我的说法,问题是因为 changeWorkingDirectory() 被多次调用。

changeWorkingDirectory() returns一个boolean表示成功或者失败,但是在失败的时候隐藏了失败的原因。如果查看源代码:

public boolean changeWorkingDirectory(String pathname) throws IOException
{
    return FTPReply.isPositiveCompletion(cwd(pathname));
}

它只是包装了对 cwd 的调用。

现在如果你想知道失败的原因,你可以这样写你的函数:

readExcel(String test, String filename) {
    int returnCode = client.cwd("/"+test);
    if ( FTPReply.isPositiveCompletion( returnCode ) ) {
        is =  client.retrieveFileStream(filename");
        //do the processing
    }
    else {
        System.out.println("Cannot cd to " + filename + " errorcode="+returnCode);
    }
}

然后只需查找您收到的代码的含义即可。

我运行今天遇到同样的问题:

循环 client.retrieveFileStream() 一次打印了正确的工作目录,但第二次 client.printWorkingDirectory() 只打印了 null.

在我的例子中,我只是将文件下载类型从 client.retrieveFile() 更改为 client.retrieveFileStream(),这需要随后调用 client.completePendingCommand()。文档说:

If this is not done, subsequent commands may behave unexpectedly.

更改您发布的代码,它看起来像这样:

readExcel(String test, String filename) {
    client.changeWorkingDirectory("/"+test);
    is =  client.retrieveFileStream(filename");
    //do the processing

    if(client.completePendingCommand()) {
        //File transfer successful
    } else {
        //File transfer failed
    }
}

But now I want use above code in loop and upload multiple files.

我知道这个问题已经回答了,所以这是给所有找到它的人的:

如果你想 upload/download 多个文件(如果所有文件都应该 into/are 在同一个文件夹中!)你应该只在一开始就更改工作目录,因为:

一旦您登录到服务器,它会将工作目录设置为根目录(例如 \)。如果您随后遍历文件并尝试每次都更改目录,则会发生这种情况:

  • 第一次循环迭代:它会切换到你想要的目录,例如 \subdir.
  • 第二次循环迭代:当前目录仍然是 \subdir,因此它会尝试切换到 \subdir\subdir,它可能存在也可能不存在。
  • 第三次循环迭代:当前目录是\subdir\subdir,它会尝试切换到\subdir\subdir\subdir

一旦您注销并重新登录,工作目录将再次成为根目录(例如 \)。