当前位置: 首页 > 知识库问答 >
问题:

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

唐弘厚
2023-03-14

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

谢啦

共有3个答案

轩辕成天
2023-03-14

实际上,在我的项目中,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带有urlsftp://user@www.server.comm /path/to/some/random/folder/file.txt。我传递给函数存在路径作为/path/to/一些/随机/文件夹/file.txt

封烨伟
2023-03-14

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

如果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);
}
阴元青
2023-03-14

你也可以这样做:

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的SFTPExecOption,否则会得到有关该文件的信息。

 类似资料:
  • 问题内容: 使用JSch,有没有办法在不执行ls并循环浏览文件以查找名称匹配的情况下,确定是否存在远程文件? 谢谢 问题答案: (这是如果您使用的是库的SFTP部分,这是我没有考虑的假设。) 我以为它会接受文件名。我目前无法检查。 如果不是这样,则无需手动进行迭代。您可以使用选择器变体:

  • 我有一个Spring Boot应用程序,注释为。几乎所有的存储库都需要实现一些自定义逻辑,这是使用完成的。 是否有方法创建将从机制中排除的存储库?

  • 问题内容: 我想构建一个PHP脚本来验证SQL查询,但不执行它。它不仅应验证语法,而且还应在可能的情况下让您知道是否可以通过查询中的命令来执行查询。这是我想要执行的操作的伪代码: 这样的事情。我希望它模拟查询而不执行它。那就是我想要的,对此我什么也找不到。 为什么我们不希望执行查询的一个示例是,如果查询向数据库中添加了一些内容。我们只希望它在不修改数据库的情况下对其进行仿真。 任何链接或示例将不胜

  • 问题内容: 关于将行旋转为各种数据库的列,有很多文章。他们似乎分为两个阵营,使用案例陈述或使用数据库供应商的内置功能。我正在使用 MySQL ,到目前为止,在任何内置函数上都找不到任何东西,这将使我能够选择任意数量的行值(我想将其转换为列)。如果我不提前知道这些值,则无法构建经常出现在的CASE查询。我想知道在MySQL中是否有类似于其他数据库中称为交叉表或数据透视表的东西: -Postgresq

  • 问题内容: 我知道你可以打电话 如果它不是可执行文件,则会得到一个异常,但这是不安全的,因为运行可执行文件会产生副作用。 我想只检查扩展名在Windows上就足够了,但是有没有办法我可以读取* nix文件系统上的可执行文件呢? 找出文件在OS中是否可执行的最佳方法是什么? 问题答案: 参见java.io.File.canExecute()