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
。
一旦您注销并重新登录,工作目录将再次成为根目录(例如 \
)。
我在下面编写了一段代码,用于将 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
。
一旦您注销并重新登录,工作目录将再次成为根目录(例如 \
)。