apache ftp相关问题整理

来源:互联网 发布:笨方法学python ex26 编辑:程序博客网 时间:2024/05/18 00:19

用apache的ftp功能,操作中文服务器时,经常遇到各种各样的问题:

比如ftpClient.listFiles() 为空问题(返回值为null),请参考我的另一篇帖子:http://blog.csdn.net/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.csdn.net/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类型返回值。




0 0