Java 使用JSch,有没有一种方法可以在不执行ls的情况下判断远程文件是否存在?

Java 使用JSch,有没有一种方法可以在不执行ls的情况下判断远程文件是否存在?,java,jsch,Java,Jsch,使用JSch,是否有一种方法可以判断远程文件是否存在,而无需执行ls并在文件中循环查找名称匹配 谢谢您可以通过 if [ -e FILE_NAME ] ; then //do something fi 或 目录 或 用于软链接 我希望这有帮助 下面是一个在远程计算机上运行命令的示例 您可以很好地运行ls或传递整个脚本。这与将脚本复制到远程计算机然后执行它是一样的。(如果您使用的是库的SFTP部分,这是我在没有考虑的情况下做出的假设。) 我认为它的ls(字符串路径)会接受文件名;我

使用JSch,是否有一种方法可以判断远程文件是否存在,而无需执行
ls
并在文件中循环查找名称匹配

谢谢

您可以通过

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

目录

用于软链接

我希望这有帮助


下面是一个在远程计算机上运行命令的示例

您可以很好地运行
ls
或传递整个脚本。这与将脚本复制到远程计算机然后执行它是一样的。

(如果您使用的是库的SFTP部分,这是我在没有考虑的情况下做出的假设。)

我认为它的
ls(字符串路径)
会接受文件名;我现在不能查

如果没有,则不需要手动迭代;您可以使用选择器变量:

ls(String path, ChannelSftp.LsEntrySelector selector)

这就是我在中检查目录存在的方式

注意:与此问题无关,但有些人可能会发现它很有用

如果目录不存在,则创建目录

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,则会得到一个id为2的SftpExecption,否则会得到有关该文件的信息。

实际上在我的项目中
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();
}
例如,有一个带有url的文件
file.txt
sftp://user@www.server.comm/path/to/some/random/folder/file.txt。我以
/path/to/some/random/folder/file.txt

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 doesn't 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;
}

}

这是正确的解决方案,因为它可以查找名称中带有“*”的文件→ 没有球!这至少是相关的,我来这里是专门检查目录,而不是文件。我试图弄清楚传递给我的程序的参数是否引用了远程系统上的目录或文件,谢谢。如果文件不存在,此调用会引发异常,因此,您需要由
Oleg Svechkarenko
zelinka
提供的错误处理,在那里回答如果您使用文件的完整路径并且文件存在,您将获得一个元素的向量。如果文件不存在,您将得到
com.jcraft.jsch.SftpException
。id=
ChannelSftp.SSH\u FX\u NO\u这样的文件
欢迎访问该站点!这样的答案在内容上可能有用,但对提供的代码提供某种解释或上下文总是有帮助的。我建议编辑您的答案,以便更详细地解释代码的作用以及如何解决问题。这对于将来的访问者看到您的答案时非常有用,因为他们可能不理解您的代码段,但可能更好地理解您的解释,或者您对您的代码段的解释可以帮助他们解决类似的问题。请进一步编辑此(更新)答案,如@Catch44Vector之前的评论中所建议的那样进行解释!!已经很久了,我的老朋友。
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();
}
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 doesn't 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;
}