问题描述:如题
lib库:apache commons-net库,ftp应用
常见场景:递归遍历ftp服务器文件列表,切换工作路径(即ftp中的cd命令)
问题表现:能够正常进入纯英文路径;无法进入中文目录
原因分析:查看commons-net源码。
方法定义:
@return
public boolean changeWorkingDirectory(String pathname) throws IOException
{
return FTPReply.isPositiveCompletion(cwd(pathname));
}
1,返回boolean类型,暗示这个操作是可能失败,失败后工作路径不改变。而一般我们使用这个lib方法时,都不做成功判断。
2,实际调用FTPClient.cwd(String path)方法
问题本质:
1,从英文无问题,中文有问题,说明是命令的编码导致,即我们送中文路径的ftp命令编码是错误的,真正正确的编码应该是服务器端的编码
2,查看源码可知,查找我们送的编码和实际正确的编码:调用changeWorkingDirectory()方法使用的编码为FTPClient.setControlEncoding()所设置的编码,而系统默认为
public static final String DEFAULT_CONTROL_ENCODING = "ISO-8859-1";
3,如果没有显示调用setControlEncoding方法,则使用默认系统编码,而默认编码是不会有问题的
4,为了获取不会乱码的中文路径名,调用setControlEncoding("GBK");改变了编码,导致问题
解决方法:
改变调用pathname的编码
changeWorkingDirectory(new String(pathname.getBytes(),FTP.DEFAULT_CONTROL_ENCODING));