Используйте JSch, чтобы поместить файл в удаленный каталог, и если каталог не существует, то создайте его
Я хотел бы скопировать файл в удаленный каталог, используя библиотеку Jsch и протокол SFTP. Если каталог на удаленном хосте не существует, создайте его.
В документе API, http://epaul.github.com/jsch-documentation/javadoc/, я заметил в методе put, что есть своего рода "режим", но это просто режим передачи: - режим передачи, РЕЗЮМЕ, ПРИЛОЖЕНИЕ, ПЕРЕЗАПИСЬ.
Есть ли простой способ сделать это без необходимости писать собственный код для проверки существования, а затем рекурсивно создать каталог?
4 ответа
Не так далеко, как я знаю. Я использую следующий код для достижения того же:
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 папка с именем "папка" не существует, но при выполнении sftp.mkdir(папка) в предложении catch ее создал другой поток. Лучший способ (конечно, для удаленных серверов на основе 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; }