apache ftp相关问题整理

本文介绍了使用Apache FTPClient过程中常见的两个问题及解决方案:一是listFiles()返回空数组的问题;二是changeWorkingDirectory()路径问题,包括相对路径的正确使用。文章还提供了一个递归删除远程FTP服务器上所有文件和文件夹的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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类型返回值。

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值