Используя JSch, есть ли способ определить, существует ли удаленный файл, не выполняя ls
и не перебирая файлы, чтобы найти совпадение имени?
Спасибо
Используя JSch, есть ли способ определить, существует ли удаленный файл, не выполняя ls
и не перебирая файлы, чтобы найти совпадение имени?
Спасибо
(Это если вы используете часть библиотеки SFTP, предположение, которое я сделал, не задумываясь об этом.)
Я думал, что его ls(String path)
будет принимать имена файлов; Я не могу проверить в данный момент.
Если это не так, вам не нужно выполнять итерацию вручную; вы можете использовать вариант селектора:
ls(String path, ChannelSftp.LsEntrySelector selector)
Oleg Svechkarenko
или zelinka
в ответах
- person Ralph; 11.02.2019
com.jcraft.jsch.SftpException
. с идентификатором = ChannelSftp.SSH_FX_NO_SUCH_FILE
- person Michal Krasny; 03.09.2020
Вот как я проверяю наличие каталога в 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);
}
Вы также можете сделать что-то вроде этого:
try {
channelSftp.lstat(name);
} catch (SftpException e){
if(e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE){
// file doesn't exist
} else {
// something else went wrong
throw e;
}
}
Если вы выполняете lstat для чего-то, чего не существует, вы получаете SftpExecption с идентификатором 2, в противном случае вы получаете информацию о файле.
На самом деле в моем проекте ls
работает без циклов. Я просто перехожу к пути вызова ls
с именем файла.
private static boolean exists(ChannelSftp channelSftp, String path) {
Vector res = null;
try {
res = channelSftp.ls(path);
} catch (SftpException e) {
if (e.id == SSH_FX_NO_SUCH_FILE) {
return false;
}
log.error("Unexpected exception during ls files on sftp: [{}:{}]", e.id, e.getMessage());
}
return res != null && !res.isEmpty();
}
Например, есть файл file.txt
с адресом sftp://[email protected]/path/to/some/random/folder/file.txt
. Я перехожу к функции exists
path
как /path/to/some/random/folder/file.txt
вы можете проверить по
if [ -e FILE_NAME ] ; then
//do something
fi
or
if [ -d DIRNAME ]
для каталога
or
if [ -l SYMLINK ]
для программных ссылок
надеюсь, это поможет
Вот пример запуска команд на удаленном компьютере http://www.jcraft.com/jsch/examples/Exec.java.html
Вы можете очень хорошо запустить ls
или пройти весь скрипт. Это то же самое, что скопировать скрипт на удаленную машину и затем выполнить его.