使用JSch,有没有办法判断一个远程文件是否存在,而不是执行ls?
(这是如果你使用的库,假设我不假思索地做出的SFTP一部分。)
我以为它ls(String path)
会接受的文件名;我目前无法检查。
如果没有,则不需要手动迭代;您可以使用选择器变体:
ls(String path, ChannelSftp.LsEntrySelector selector)
您可以通过
if [ -e FILE_NAME ] ; then
//do something
fi
或
if [ -d DIRNAME ]
的目录检查
或
if [ -l SYMLINK ]
的软链接
我希望这有助于
这里是一个远程机器http://www.jcraft.com/jsch/examples/Exec.java.html
上运行命令可以很好的运行ls
或消磨整个脚本的例子。这与将脚本复制到远程机器然后执行它相同。
这是我如何检查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);
}
这是正确的解决方案,因为它在名称中找到带有'*'的文件→没有匹配! – 2015-11-25 15:49:56
至少是相关的,我特意来这里检查目录,而不是文件。我试图弄清楚传递给我的程序的参数是否引用远程系统上的目录或文件,所以谢谢。 – gravy21 2018-02-01 15:10:38
你也可以做这样的事情:
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的id,否则你会得到关于该文件的信息。
其实在我的项目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 sftp://[email protected]/path/to/some/random/folder/file.txt
文件file.txt
。我传递给函数exists
path
as /path/to/some/random/folder/file.txt
我以为你可以通过Jsch发送命令。 – Nishant 2012-08-15 12:07:18
你说得对,我假设OP使用库的sftp部分 - 对不起! – 2012-08-15 12:08:46