Подтвердить что ты не робот

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

ls(String path, ChannelSftp.LsEntrySelector selector)

Ответ 2

Вот как я проверяю существование каталога в JSch.

Примечание: не относится к этому вопросу, но некоторые из них могут оказаться полезными.

Создать каталог, если dir не существует

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);
}

Ответ 3

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

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

Ответ 4

На самом деле в моем проекте 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 с URL sftp://[email protected]/path/to/some/random/folder/file.txt. Я перехожу к функции exists path как /path/to/some/random/folder/file.txt

Ответ 5

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

 if [ -e FILE_NAME ] ; then
    //do something
 fi

или

  if [ -d DIRNAME ]

для каталога

или

    if [ -l SYMLINK ]

для программных ссылок

Я надеюсь, что это поможет


Вот пример запуска команд на удаленном компьютере http://www.jcraft.com/jsch/examples/Exec.java.html

Вы можете очень хорошо запустить ls или пройти целый script. То же самое, что и копирование script на удаленный компьютер, а затем его выполнение.

Ответ 6

import java.util.ArrayList;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class FileExists {

ChannelExec channelExec = null;
static Channel channel = null;

static String host = "hostname";
static String user = "username";
static String password = "password$";

public static void main(String[] args) {
    String filename = "abc.txt";
    String filepath = "/home/toolinst/ggourav";
    try {
        Channel channel = getChannelSftp(host, user, password);
        channel.connect();
        ChannelSftp channelSftp = (ChannelSftp) channel;
        channelSftp.cd(filepath);
        String path = channelSftp.ls(filename).toString();
        if (!path.contains(filename)) {
            System.out.println("File does not exist.");
        } else
            System.out.println("File already exist.");

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private static Channel getChannelSftp(String host, String user, String password) {
    try {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
        session.setConfig(config);
        session.setPassword(password);
        session.connect();
        channel = session.openChannel("sftp");

    } catch (Exception e) {
        System.out.println("Failed to get sftp channel. " + e);
    }
    return channel;
}

}

Ответ 7

Я видел -1 в моем предыдущем ответе. Надеюсь, вам было непонятно. Ниже приведен весь код для той же функциональности. Также дайте мне знать, если вам нужна другая информация об этом.

import java.util.ArrayList;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class FileExists {

ChannelExec channelExec = null;
static Channel channel = null;

static String host = "hostname";
static String user = "username";
static String password = "password$";

public static void main(String[] args) {
    String filename = "abc.txt";
    String filepath = "/home/toolinst/ggourav";
    try {
        Channel channel = getChannelSftp(host, user, password);
        channel.connect();
        ChannelSftp channelSftp = (ChannelSftp) channel;
        channelSftp.cd(filepath);
        String path = channelSftp.ls(filename).toString();
        if (!path.contains(filename)) {
            System.out.println("File does not exist.");
        } else
            System.out.println("File already exist.");

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private static Channel getChannelSftp(String host, String user, String password) {
    try {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
        session.setConfig(config);
        session.setPassword(password);
        session.connect();
        channel = session.openChannel("sftp");

    } catch (Exception e) {
        System.out.println("Failed to get sftp channel. " + e);
    }
    return channel;
}

}