有个小需求,需要用到遍历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();
}
}
}