20

我想使用 Jsch 库和 SFTP 协议将文件复制到远程目录。如果远程主机上的目录不存在,则创建它。

在 API 文档http://epaul.github.com/jsch-documentation/javadoc/中,我注意到在 put 方法中有一种“模式”,但它只是传输模式: - 传输模式,恢复、附加、覆盖之一。

有没有一种简单的方法可以做到这一点,而不必编写我自己的代码来检查是否存在,然后递归地创建一个目录?

4

4 回答 4

40

据我所知不是。我使用下面的代码来实现同样的事情:

String[] folders = path.split( "/" );
for ( String folder : folders ) {
    if ( folder.length() > 0 ) {
        try {
            sftp.cd( folder );
        }
        catch ( SftpException e ) {
            sftp.mkdir( folder );
            sftp.cd( folder );
        }
    }
}

sftp对象在哪里ChannelSftp

于 2012-10-11T12:29:37.583 回答
8

这就是我在JSch中检查目录存在的方式。

如果目录不存在则创建

ChannelSftp channelSftp = (ChannelSftp)channel;
String currentDirectory=channelSftp.pwd();
String dir="abc";
SftpATTRS attrs=null;
try {
    attrs = channelSftp.stat(currentDirectory+"/"+dir);
} catch (Exception e) {
    System.out.println(currentDirectory+"/"+dir+" not found");
}

if (attrs != null) {
    System.out.println("Directory exists IsDir="+attrs.isDir());
} else {
    System.out.println("Creating dir "+dir);
    channelSftp.mkdir(dir);
}
于 2013-11-21T12:42:32.347 回答
3

如果您使用多个线程连接到远程服务器,上述答案可能不起作用。例如,当 sftp.cd 执行时,没有名为“文件夹”的文件夹,但是在 catch 子句中执行 sftp.mkdir(folder) 时,另一个线程创建了它。更好的方法(当然对于基于 unix 的远程服务器)是使用 ChannelExec 并使用“mkdir -p”命令创建嵌套目录。

于 2013-05-19T05:52:53.797 回答
3

与具有额外功能的现成抽象方法相同的解决方案:

  • 使用包含文件名的路径;
  • 如果相同的文件已经存在,则删除。

    public boolean prepareUpload(
      ChannelSftp sftpChannel,
      String path,
      boolean overwrite)
      throws SftpException, IOException, FileNotFoundException {
    
      boolean result = false;
    
      // Build romote path subfolders inclusive:
      String[] folders = path.split("/");
      for (String folder : folders) {
        if (folder.length() > 0 && !folder.contains(".")) {
          // This is a valid folder:
          try {
            sftpChannel.cd(folder);
          } catch (SftpException e) {
            // No such folder yet:
            sftpChannel.mkdir(folder);
            sftpChannel.cd(folder);
          }
        }
      }
    
      // Folders ready. Remove such a file if exists:    
      if (sftpChannel.ls(path).size() > 0) {
        if (!overwrite) {
          System.out.println(
            "Error - file " + path + " was not created on server. " +
            "It already exists and overwriting is forbidden.");
        } else {
          // Delete file:
          sftpChannel.ls(path); // Search file.
          sftpChannel.rm(path); // Remove file.
          result = true;
        }
      } else {
        // No such file:
        result = true;
      }
    
      return result;
    }
    
于 2015-11-08T08:03:55.153 回答