channelSftp.mkdir() 创建不了文件夹、没有权限

SFTP 不支持创建多级目录,可以循环创建

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 返回到根目录(或你指定的基准路径),从根目录开始创建目录结构。

关键点:

  1. 根目录重置:每次创建之前,确保从根目录(basePath)开始执行。这里使用 channelSftp.cd(basePath) 切换到根目录,避免遗留在之前的路径上。

  2. 完整路径创建:每次拼接 currentPath 时,使用完整路径(绝对路径),确保在每次 cd()mkdir() 操作时指向正确的目录。

  3. 日志输出和错误处理:保持日志输出,以便追踪每一步操作,并在出现问题时捕获异常,记录无法创建的目录。

注意事项:

  • basePath 可以是你希望的起始路径,通常为根目录 /,也可以是某个特定用户目录。
  • 避免只在某个子目录停留,否则在下次操作时,它不会自动回到根目录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值