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

时间:2014-02-07 10:43:01

标签: java jsch mkdir

我正在使用jSch在Java中创建文件上传应用程序。我想根据创建日期等将我的文件放在不同的目录中。

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

实现这一目标:

  • 我必须像Dir'y一样创造 "/var/local/recordingsbackup/20140207/root/SUCCESS/WN/"并提出 其中的数据。

到目前为止我已经尝试过了:

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/之类的单个目录,则不会发生错误并且文件已成功上传。

请帮助我...如何创建这些嵌套目录???

4 个答案:

答案 0 :(得分:1)

最后,我已经完成了。

这就是我成功的方式:

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);
        }

答案 1 :(得分:0)

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

答案 2 :(得分:0)

    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()) {
                ch.mkdir(fullPath + folders[i]); 
            }
            fullPath = fullPath + folders[i] + "/";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我使用此实现来创建嵌套文件夹。

我尽量不使用Exception。请记住,文件系统是基于Linux的。 OP已经找到了解决方案,但我想补充一下。 如果我想创建的文件夹不存在于&#34; ls&#34;我只是做mkdir。结果

答案 3 :(得分:-1)

更正之前的脚本:

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();
    }
}

另一种解决方案是执行shell命令:

String remotePath = "fake/folders/recursive/on/sftp/server";

ChannelExec channel = (ChannelExec) session.openChannel("exec");
// NOTE: the provided paths are expected to require no escaping
channel.setCommand("mkdir -p " + remotePath);
channel.connect();
while (!channel.isClosed()) {
    // dir creation is usually fast, so only wait for a short time
    Thread.sleep(SHORT_WAIT_MSEC);
}
channel.disconnect();
if (channel.getExitStatus() != 0) {
    throw new IOException("Creating directory failed: "  + remotePath);
}