使用JSch,有没有办法判断一个远程文件是否存在而没有执行ls?

时间:2012-08-15 11:59:41

标签: java jsch

使用JSch,有没有办法告诉远程文件是否存在而不进行ls并循环遍历文件以查找名称匹配?

由于

7 个答案:

答案 0 :(得分:14)

这就是我在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);
}

答案 1 :(得分:8)

您也可以这样做:

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,否则您将获得有关该文件的信息。

答案 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的网址为sftp://user@www.server.comm/path/to/some/random/folder/file.txt。我将exists path作为/path/to/some/random/folder/file.txt

传递给我

答案 3 :(得分:3)

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

我认为ls(String path)会接受文件名;我现在不能检查。

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

ls(String path, ChannelSftp.LsEntrySelector selector)

答案 4 :(得分:1)

你可以通过

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

  if [ -d DIRNAME ]

目录

    if [ -l SYMLINK ]

用于软链接

我希望这会有所帮助


以下是在远程计算机http://www.jcraft.com/jsch/examples/Exec.java.html

上运行命令的示例

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

答案 5 :(得分:0)

我在先前的回答中看到-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 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;
}

}

答案 6 :(得分:-1)

public boolean exist(ChannelSftp channelSftp, String filename) {
        String path = channelSftp.ls(channelSftp.pwd()).toString();
        if (path.contains(filename)) {
            System.out.println("File exist.");
            return true;        
        } else {
            System.out.println("File doesn't exist");
            return false;
        }
    }