在Java中使用JSch在服务器上创建嵌套目录

在Java中使用JSch在服务器上创建嵌套目录,java,jsch,mkdir,Java,Jsch,Mkdir,我正在使用jSch制作一个Java文件上传应用程序。我想把我的文件放在不同的目录根据他们的创建日期等 我有一个主目录“/var/local/recordingsbackup/”,我正在其中创建其他目录并将数据放入其中 为实现这一目标: 我必须创造一个直接的喜欢 “/var/local/recordingsbackup/20140207/root/SUCCESS/WN/”和put 里面有数据 到目前为止,我已经试过了: private void fileTransfer(ChannelSftp

我正在使用
jSch
制作一个Java文件上传应用程序。我想把我的文件放在不同的目录根据他们的创建日期等

我有一个主目录
“/var/local/recordingsbackup/”
,我正在其中创建其他目录并将数据放入其中

为实现这一目标:

  • 我必须创造一个直接的喜欢
    “/var/local/recordingsbackup/20140207/root/SUCCESS/WN/”
    和put 里面有数据
到目前为止,我已经试过了:

private void fileTransfer(ChannelSftp channelTarget, temp_recording_log recObj, String filePath) {

        int fileNameStartIndex = filePath.lastIndexOf("/") + 1;
        String date = new SimpleDateFormat("yyyyMMdd").format(recObj.getCalldate());
        String fileName = filePath.substring(fileNameStartIndex);
        String staticPath = "/var/local/recordingsbackup/";
        String completeBackupPath = staticPath + date + "/" + recObj.getUsername() + "/" + recObj.getStatus() + "/" + recObj.getDisposition() + "/";

        try {
            InputStream get = SourceChannel.get(filePath);
            try {
                channelTarget.put(get, completeBackupPath + fileName);
            } catch (SftpException e) {
                System.out.println("Creating Directory...");
                channelTarget.mkdir(completeBackupPath); // error on this line
                channelTarget.put(get, completeBackupPath + fileName);
            }
        } catch (SftpException e) {
            log.error("Error Occured ======== File or Directory dosen't exists === " + filePath);
            e.printStackTrace();
        }
}
  • 如果我正在创建单目录,如
    /var/local/recordingsbackup/
    ,则不会发生错误,文件也会成功上载

请在这方面帮助我…我如何创建这些嵌套目录???

我认为在SFTP协议中您不可能想做什么。您必须依次创建每个子目录。

我认为在SFTP协议中您不可能想做什么。您必须依次创建每个子目录。

最后,我已经完成了

这就是我成功的原因:

try {
            channelTarget.put(get, completeBackupPath + fileName);
        } catch (SftpException e) {
            System.out.println("Creating Directory...");
            String[] complPath = completeBackupPath.split("/");
            channelTarget.cd("/");
            for (String dir : complPath) {
                if (folder.length() > 0) {
                    try {
                        System.out.println("Current Dir : " + channelTarget.pwd());
                        channelTarget.cd(folder);
                    } catch (SftpException e2) {
                        channelTarget.mkdir(folder);
                        channelTarget.cd(folder);
                    }
                }
            }
            channelTarget.cd("/");
            System.out.println("Current Dir : " + channelTarget.pwd());
            channelTarget.put(get, completeBackupPath + fileName);
        }
终于,我做到了

这就是我成功的原因:

try {
            channelTarget.put(get, completeBackupPath + fileName);
        } catch (SftpException e) {
            System.out.println("Creating Directory...");
            String[] complPath = completeBackupPath.split("/");
            channelTarget.cd("/");
            for (String dir : complPath) {
                if (folder.length() > 0) {
                    try {
                        System.out.println("Current Dir : " + channelTarget.pwd());
                        channelTarget.cd(folder);
                    } catch (SftpException e2) {
                        channelTarget.mkdir(folder);
                        channelTarget.cd(folder);
                    }
                }
            }
            channelTarget.cd("/");
            System.out.println("Current Dir : " + channelTarget.pwd());
            channelTarget.put(get, completeBackupPath + fileName);
        }
publicstaticvoidmkdirs(channelsftpch,字符串路径){
试一试{
String[]folders=path.split(“/”);
如果(文件夹[0].isEmpty())文件夹[0]=“/”;
字符串完整路径=文件夹[0];
对于(int i=1;i
我使用此实现创建嵌套文件夹

我尽量不使用异常。请记住,文件系统是基于linux的。 OP已经找到了一个解决方案,但我想附加它。 如果要创建的文件夹在“ls”结果中不存在,我只需执行mkdir操作。

公共静态void mkdirs(ChannelSftp ch,字符串路径){
试一试{
String[]folders=path.split(“/”);
如果(文件夹[0].isEmpty())文件夹[0]=“/”;
字符串完整路径=文件夹[0];
对于(int i=1;i
我使用此实现创建嵌套文件夹

我尽量不使用异常。请记住,文件系统是基于linux的。 OP已经找到了一个解决方案,但我想附加它。
如果要创建的文件夹在“ls”结果中不存在,我只需执行mkdir操作。

更正先前的脚本:

public static void mkdirs(ChannelSftp ch, String path) {
    try {
        String[] folders = path.split("/");
        if (folders[0].isEmpty()) folders[0] = "/";
        String fullPath = folders[0];
        for (int i = 1; i < folders.length; i++) {
            Vector ls = ch.ls(fullPath);
            boolean isExist = false;
            for (Object o : ls) {
                if (o instanceof LsEntry) {
                    LsEntry e = (LsEntry) o;
                    if (e.getAttrs().isDir() && e.getFilename().equals(folders[i])) {
                        isExist = true;
                    }
                }
            }
            if (!isExist && !folders[i].isEmpty()) {
                // Add separator path
                ch.mkdir(fullPath + "/" + folders[i]); 
            }
            // Add separator path
            fullPath = fullPath + "/" + folders[i] + "/";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

更正以前的脚本:

public static void mkdirs(ChannelSftp ch, String path) {
    try {
        String[] folders = path.split("/");
        if (folders[0].isEmpty()) folders[0] = "/";
        String fullPath = folders[0];
        for (int i = 1; i < folders.length; i++) {
            Vector ls = ch.ls(fullPath);
            boolean isExist = false;
            for (Object o : ls) {
                if (o instanceof LsEntry) {
                    LsEntry e = (LsEntry) o;
                    if (e.getAttrs().isDir() && e.getFilename().equals(folders[i])) {
                        isExist = true;
                    }
                }
            }
            if (!isExist && !folders[i].isEmpty()) {
                // Add separator path
                ch.mkdir(fullPath + "/" + folders[i]); 
            }
            // Add separator path
            fullPath = fullPath + "/" + folders[i] + "/";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

您可能想解释为什么您认为上一个(哪个?)开关需要修复为什么要使用
ls
检查文件夹是否存在?那太没效率了。使用
stat
。您可能需要解释为什么您认为上一个(哪个?)开关需要修复为什么要使用
ls
检查文件夹是否存在?那太没效率了。使用
stat