20

Jsch ライブラリと SFTP プロトコルを使用してファイルをリモート ディレクトリにコピーしたいと考えています。リモート ホストにディレクトリが存在しない場合は、作成します。

API ドキュメントhttp://epaul.github.com/jsch-documentation/javadoc/で、put メソッドに一種の「モード」があることに気付きましたが、それは単なる転送モードです: - 転送モード、 RESUME、APPEND、OVERWRITE のいずれか。

独自のコードを記述して存在を確認し、再帰的にディレクトリを作成することなく、これを行う簡単な方法はありますか?

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 に答える
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 に答える
3

複数のスレッドでリモートサーバーに接続すると、上記の回答が機能しない場合があります。たとえば、sftp.cd が実行されたときに「folder」という名前のフォルダーはありませんが、catch 句で sftp.mkdir(folder) を実行すると、他のスレッドがそれを作成したとします。より良い方法 (もちろん UNIX ベースのリモート サーバーの場合) は、ChannelExec を使用し、"mkdir -p" コマンドを使用してネストされたディレクトリを作成することです。

于 2013-05-19T05:52:53.797 に答える