Используя JSch, есть ли способ узнать, существует ли удаленный файл, не выполняя ls?

Используя JSch, есть ли способ определить, существует ли удаленный файл, не выполняя ls и не перебирая файлы, чтобы найти совпадение имени?

Спасибо


person cagcowboy    schedule 15.08.2012    source источник


Ответы (6)


(Это если вы используете часть библиотеки SFTP, предположение, которое я сделал, не задумываясь об этом.)

Я думал, что его ls(String path) будет принимать имена файлов; Я не могу проверить в данный момент.

Если это не так, вам не нужно выполнять итерацию вручную; вы можете использовать вариант селектора:

ls(String path, ChannelSftp.LsEntrySelector selector)
person Dave Newton    schedule 15.08.2012
comment
Этот вызов вызывает исключение, если файл не существует, поэтому вам нужна обработка ошибок, предоставляемая Oleg Svechkarenko или zelinka в ответах - person Ralph; 11.02.2019
comment
Если вы используете полный путь к файлу, а файл существует, вы получите вектор с одним элементом. Если файл не существует, вы получите 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);
}
person AabinGunz    schedule 21.11.2013
comment
Это правильное решение, потому что оно находит файлы с '*' в имени → без подстановки! - person Nils-o-mat; 25.11.2015
comment
По крайней мере, это связано, и я пришел сюда специально, чтобы проверить каталог, а не файлы. Я пытался выяснить, ссылается ли параметр, переданный моей программе, на каталог или файл в удаленной системе, так что спасибо. - person gravy21; 01.02.2018

Вы также можете сделать что-то вроде этого:

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, в противном случае вы получаете информацию о файле.

person zelinka    schedule 23.03.2017

На самом деле в моем проекте 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

person Oleg Svechkarenko    schedule 05.12.2017
comment
Вектор!! Это было давно, мой старый друг. - person Benny Bottema; 26.03.2021

вы можете проверить по

 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 или пройти весь скрипт. Это то же самое, что скопировать скрипт на удаленную машину и затем выполнить его.

person Nishant    schedule 15.08.2012

person    schedule
comment
Добро пожаловать на сайт! Ответы, подобные этому, могут быть полезны в содержании, но предоставление какого-либо объяснения или контекста предоставленному коду всегда полезно. Я бы рекомендовал отредактировать ваш ответ, чтобы более подробно объяснить, что делает ваш код и как он решает проблему. Это полезно, когда будущие посетители увидят ваш ответ, так как они могут не понять ваш фрагмент кода, но могут лучше понять ваше объяснение, или ваше объяснение вашего фрагмента кода может помочь им решить аналогичную проблему, с которой они столкнулись. - person ; 21.06.2019
comment
пожалуйста, отредактируйте этот (обновите) ответ, чтобы объяснить его, как было предложено также в предыдущем комментарии от @Catch44. - person Pierre.Vriens; 25.08.2019