用apache的ftp功能,操作中文服务器时,经常遇到各种各样的问题:
比如ftpClient.listFiles() 为空问题(返回值为null),请参考我的另一篇帖子:http://blog.youkuaiyun.com/wangchsh2008/article/details/47101423
今天再总结几个问题,服务广大同行新手,也方便自己以后的工作。
第1个问题:
ftpClient.listFiles()有时候,不为null,但是总是返回空数组,比如
FTPFile[] files = ftpClient.listFiles();
日志打印files.length 始终为0,而且我发现如果用String[] names = ftp.listNames();
则names是有效的,能够返回正常的文件列表名称。
但是由于特殊需要,有时候我们还是需要FTPFile[] files = ftpClient.listFiles();
因为通过FTPFile我们可以更方便地判断其子是文件夹还是文件。(比如递归删除远程服务器上的所有文件及其文件夹)
试了很久,发现原因同ftpClient.listFiles() 为空问题,最终解决用的办法依旧是:http://blog.youkuaiyun.com/wangchsh2008/article/details/47101423
第2个问题:
ftpClient.changeWorkingDirectory(pathname)的路径问题
假设ftp服务器的目录结构为
app
|
|
test
|
| - - 20160718
| |
| | - - file1
| | - - file2
|
|
| - - 20160719
| |
| | - - file3
| | - - file4
|
|
| - - 20160720
| |
| | - - file5
| | - - file6
| | - - mydir
| |
| | -- file7
现在要获取所有文件file1 到file7。
一上来ftpClient.changeWorkingDirectory("app/test");
list之后,如果想到20160720目录的mydir下面取文件,那么如何cd呢?
这里需要考虑相对路径问题,第二次cd是建立在第一次cd基础上的。也就是说,第二次应该这样做:ftpClient.changeWorkingDirectory("20160720/mydir");
当然如果还有20160721目录且有子目录,那么需要进行第3次cd时,需要考虑当前client已经在什么目录。
拿递归删除远程ftp文件下所有子文件或文件夹为例:
//删除path及其下面所有文件
private void removeAll(FTPClient ftpClient,String pathname) throws IOException{
logger.info("当前remove路径:"+pathname);
boolean flag = ftpClient.changeWorkingDirectory(pathname);
logger.info("cd " + pathname + " " + flag);
FTPFile[] files = ftpClient.listFiles();
if(files != null && files.length > 0){
logger.info("Its children length " + files.length);
for(FTPFile child : files){
logger.info("处理 child " + child.getName());
if(child.isDirectory()){
removeAll(ftpClient,child.getName());
} else {
ftpClient.deleteFile(child.getName());
}
}
}
ftpClient.changeToParentDirectory();
ftpClient.removeDirectory(pathname);
}
请注意每次cd到目录里,最后都会先cd回到父目录,代码为:
ftpClient.changeToParentDirectory();
ftpClient.removeDirectory(pathname);只能删除空的文件夹,删除成功或者失败,有对应的boolean类型返回值。