SFTP 不支持创建多级目录,可以循环创建
java">String[] folders = path.split("/");
// 使用绝对路径的根目录,确保每次都从根目录开始创建
String basePath = "/"; // 设置你想要的根路径,如 "/home/user"try {channelSftp.cd(basePath); // 确保每次操作从根目录开始
} catch (SftpException e) {throw new RuntimeException("无法切换到根目录: " + basePath, e);
}String currentPath = basePath; // 初始化为根路径for (int i = 3; i < folders.length; i++) {String folder = folders[i];if (folder.equals("null") || folder.isEmpty()) continue; // 跳过空文件夹或根路径currentPath += "/" + folder; // 拼接完整路径try {channelSftp.cd(currentPath); // 尝试进入完整路径} catch (SftpException e) {// 如果目录不存在,则创建try {channelSftp.mkdir(currentPath); // 创建新目录channelSftp.cd(currentPath); // 进入新创建的目录} catch (SftpException mkdirException) {throw new RuntimeException("无法创建目录: " + currentPath, mkdirException);}}log.info("目录已创建或存在: {}", currentPath);
}
确保每次循环创建目录之前,channelSftp
返回到根目录(或你指定的基准路径),从根目录开始创建目录结构。
关键点:
-
根目录重置:每次创建之前,确保从根目录(
basePath
)开始执行。这里使用channelSftp.cd(basePath)
切换到根目录,避免遗留在之前的路径上。 -
完整路径创建:每次拼接
currentPath
时,使用完整路径(绝对路径),确保在每次cd()
和mkdir()
操作时指向正确的目录。 -
日志输出和错误处理:保持日志输出,以便追踪每一步操作,并在出现问题时捕获异常,记录无法创建的目录。
注意事项:
basePath
可以是你希望的起始路径,通常为根目录/
,也可以是某个特定用户目录。- 避免只在某个子目录停留,否则在下次操作时,它不会自动回到根目录