FtpClient切换、创建目录不成功的问题(makeDirectory、changeWorkingDirectory)
做功能时切换目录老是不成功且无法创建文件夹,翻阅一些博客后发现Ftp创建目录只能逐级创建:连接https://blog.csdn.net/Joze_3/article/details/76933888
#做了几个测试:
##1.父路径、子路径皆不存在
public static void main(String[] args) throws Exception {
ConfigUtil instance = ConfigUtil.getInstance("/config.properties");
FTPClient ftp = null;
try {
ftp = FtpUtil.getFTPClient(instance.getValue("ftp_ip"), instance.getValue("ftp_port"),
instance.getValue("ftp_user"), instance.getValue("ftp_pwd"));
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
ftp.setDefaultTimeout(600000);
ftp.setDataTimeout(600000);
ftp.setSoTimeout(600000);
ftp.setControlEncoding("GBK");
String fileUrl = "/test/te/";
if (!ftp.changeWorkingDirectory(fileUrl)) {
System.err.println("不存在");
boolean makeDirectory = ftp.makeDirectory(fileUrl);
boolean changeWorkingDirectory = ftp.changeWorkingDirectory(fileUrl);
System.err.println("创建:" + makeDirectory + ";切换:" + changeWorkingDirectory);
} else {
System.err.println("存在");
}
}catch (Exception e) {
e.printStackTrace();
throw e;
}finally {
if(ftp != null) {
try {
ftp.logout();
ftp.disconnect();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
对应ftp文件夹
结果:
##2.父路径存在、子路径不存在
还是上面的代码和路径,不重复贴了
对应ftp文件夹
结果
##3.逐级创建
为了好区分换了个路径
public static void main(String[] args) throws Exception {
ConfigUtil instance = ConfigUtil.getInstance("/config.properties");
FTPClient ftp = null;
try {
ftp = FtpUtil.getFTPClient(instance.getValue("ftp_ip"), instance.getValue("ftp_port"),
instance.getValue("ftp_user"), instance.getValue("ftp_pwd"));
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
ftp.setDefaultTimeout(600000);
ftp.setDataTimeout(600000);
ftp.setSoTimeout(600000);
ftp.setControlEncoding("GBK");
String fileUrl = "/tes/t/s";
/*该部分为逐级创建*/
String[] split = fileUrl.split("/");
for (String str : split) {
if(StringUtils.isBlank(str)) {
continue;
}
if (!ftp.changeWorkingDirectory(str)) {
System.err.println("不存在");
boolean makeDirectory = ftp.makeDirectory(str);
boolean changeWorkingDirectory = ftp.changeWorkingDirectory(str);
System.err.println(str + "创建:" + makeDirectory + ";切换:" + changeWorkingDirectory);
} else {
System.err.println("存在");
}
}
}catch (Exception e) {
e.printStackTrace();
throw e;
}finally {
if(ftp != null) {
try {
ftp.logout();
ftp.disconnect();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
对应ftp目录
结果:(ps:这里切分后没有/做为分割符也同样可以创建)
##结论:
FtpCilent测试的两个方法只能逐级创建(切换)文件夹
当路径为多层时,父层找不到,无法创建子层文件夹
当路径为多层时,父层可以找到,可以直接创建子层文件夹(多级子层就不行了)
##还有几个点:
1.路径不分大小写(比如例子中的/test/te/如果写成/TEST/te/,若test文件夹存在,用/TEST是可以找到并切换的,但是/TEst这种的就没有试过了)
2.可以省略掉开头的/和结尾的/,逐级创建切换甚至可以不用/,实例里应该体现出来了
3.ConfigUtil和FtpUtil是工具类,改成对应的创建就可以了,没有做其他处理
FTPClient ftpClient = new FTPClient();
ftpClient.connect(ip, port);
ftpClient.login(user, pass);