【问题标题】:printWorkingDirectory() gives nullprintWorkingDirectory() 给出 null
【发布时间】:2019-12-13 22:55:03
【问题描述】:

我在下面编写了一段代码,用于将 Excel 记录插入到数据库表中。 Excel 文件在 ftp 服务器上。 基本上我是先更改目录 abd retrievig 文件流。

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

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

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

【问题讨论】:

  • 什么是客户端?这个方法怎么称呼?
  • client 似乎是 FTPClientapache.commons.net... 我说的对吗?
  • 是的......我真的很抱歉我没有提供足够的信息。
  • 客户端是活动的 ftp 连接。 client 被定义为全局变量,并且在调用此方法之前已经设置。

标签: java ftp-client


【解决方案1】:

changeWorkingDirectory() 返回一个布尔值来表示成功或失败,但它在失败时隐藏了失败的原因。如果你看源代码:

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);
    }
}

那你就看看你收到的代码是什么意思吧。

【讨论】:

  • 我应该在changedirectory之前还是在changedirectory方法之后调用cwd方法。
  • 第一次 FTP 回复为 250 - 请求的文件操作正常。循环中的第二次说 257 - 创建了路径名。你能告诉我这是什么意思吗?
【解决方案2】:

我今天遇到了同样的问题:

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

就我而言,我只是将文件下载类型从client.retrieveFile() 更改为client.retrieveFileStream(),这需要之后调用client.completePendingCommand()。文档说:

如果不这样做,后续命令可能会出现异常。

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

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
    }
}

但现在我想循环使用上面的代码并上传多个文件。

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

如果您要上传/下载多个文件(并且如果所有文件都应该进入/位于同一个文件夹中!)您应该只在最开始时更改工作目录,因为:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2021-08-21
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多