JschライブラリとSFTPプロトコルを使用して、リモートディレクトリにファイルをコピーしたいと思います。リモートホスト上のディレクトリが存在しない場合は、作成します。
APIドキュメント http://epaul.github.com/jsch-documentation/javadoc/ で、putメソッドで一種の「モード」があることに気付きましたが、それは単なる転送ですモード:-転送モード、RESUME、APPEND、OVERWRITEのいずれか
存在を確認するための独自のコードを記述してから再帰的にディレクトリを作成する必要なしに、これを行う簡単な方法はありますか?
私の知る限りではありません。私は同じことを達成するために次のコードを使用します:
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
オブジェクトです。
これは 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);
}
複数のスレッドでリモートサーバーに接続する場合、上記の回答が機能しない場合があります。たとえば、sftp.cdが実行されるときに「folder」という名前のフォルダーがないが、catch句でsftp.mkdir(folder)を実行すると、他のスレッドがそれを作成したことを考慮してください。より良い方法(もちろんUNIXベースのリモートサーバーの場合)は、ChannelExecを使用し、「mkdir -p」コマンドを使用してネストされたディレクトリを作成することです。
追加機能を備えた準備ができた抽象メソッドと同じソリューション:
同じファイルがすでに存在する場合は削除します。
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;
}