有个小需求,需要用到遍历ftp服务器上文件,但是ftpclient.changeWorkingDirectory()没起作用,导致递归时候无限循环。
而且坑爹的是,这个ftpclient的API出错了,不报异常,它所有的信息都包装在ftpclient.getReplayString()里面,还要开发者去调用查看。
一开始我写的时候 ftpclient.changeWorkingDirectory();没有获取它的返回值,所以一直没发现这行代码内部出错了。调用ftpclient.getReplayString()打印了下,又是常见的550代码错误,就是什么文件名,目录名语义错误。550最常见了,肯定又是编码问题。果然,对路径名转下编码,从“GBK”转“iso-8859-1”,然后就行了。
完整可以运行代码如下:
public class FTPTest { /** *@author z.wantong *@param args *@since 2016-9-20 下午2:56:33 */ public static void main(String[] args) { //遍历ftp目录 FTPClient ftp = FTPClientUtil.getFTPClientInstance(); travalDir(ftp, "/doc/"); } public static void travalDir(FTPClient ftp , String ftpPath){ try { ftpPath = new String(ftpPath.getBytes("GBK"),"iso-8859-1"); //关键是这行代码 if(ftp.changeWorkingDirectory(ftpPath)){ System.out.println("切换工作目录成功~"); }else{ System.out.print("切换工作目录失败~ "); System.out.println(ftp.getReplyString()); } //打印时,要把编码换回来,否则乱码 System.out.println("当前工作目录:"+ new String(ftp.printWorkingDirectory().getBytes("iso-8859-1"),"GBK")); FTPFile [] files = ftp.listFiles(); for(FTPFile file : files){ if(file.isFile()){ System.out.println("文件是:"+file.getName()); }else if(file.isDirectory()){ String newPath = ftpPath+file.getName()+"/"; System.out.println("进入目录:"+ newPath); travalDir(ftp, newPath); } } } catch (IOException e) { e.printStackTrace(); } }}