Usando JSch, ¿hay alguna manera de saber si existe un archivo remoto sin hacer un ls y recorrer los archivos para encontrar una coincidencia de nombre?Usando JSch, ¿hay alguna forma de saber si existe un archivo remoto sin hacer un ls?
Gracias
Usando JSch, ¿hay alguna manera de saber si existe un archivo remoto sin hacer un ls y recorrer los archivos para encontrar una coincidencia de nombre?Usando JSch, ¿hay alguna forma de saber si existe un archivo remoto sin hacer un ls?
Gracias
(esto es si usted está utilizando la parte SFTP de la biblioteca, un supuesto que hice sin pensar en ello.)
pensé su ls(String path)
aceptarían nombres de archivo; No puedo verificarlo en este momento.
Si no lo hace, no necesita iterar manualmente; puede utilizar la variante de selector:
ls(String path, ChannelSftp.LsEntrySelector selector)
puede comprobar por
if [ -e FILE_NAME ] ; then
//do something
fi
o
if [ -d DIRNAME ]
para el directorio
o
if [ -l SYMLINK ]
para softlinks
espero que esto ayude a
Aquí se muestra un ejemplo para ejecutar comandos en la máquina remota http://www.jcraft.com/jsch/examples/Exec.java.html
Puede muy bien llevado ls
o un pase de un guión conjunto. Es lo mismo que copiar el script en una máquina remota y luego ejecutarlo.
Así es como compruebo la existencia de directorio en JSch.
Nota: no está relacionado con esta pregunta, pero a algunos les puede resultar útil.
Crear directorio si no existe 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);
}
Esta es la solución correcta, porque encuentra archivos con '*' en el nombre → sin globbing! –
Está al menos relacionado y vine aquí específicamente para verificar el directorio, no los archivos. Estaba tratando de averiguar si un parámetro pasado a mi programa estaba haciendo referencia a un directorio o archivo en un sistema remoto, así que gracias. – gravy21
También puede hacer algo como esto:
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;
}
}
Si usted hace una lstat en algo que no existe obtiene un SftpExecption con una identificación de 2; de lo contrario, obtendrá información sobre el archivo.
Actualmente en mi proyecto ls
trabajando sin bucles. Acabo de pasar a la ruta de llamada ls
con nombre de archivo.
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();
}
Por ejemplo, hay un archivo file.txt
con una url sftp://[email protected]/path/to/some/random/folder/file.txt
. Paso a la función exists
path
como /path/to/some/random/folder/file.txt
Pensé que podrías enviar el comando sobre Jsch. – Nishant
Tienes razón, suponía que el OP estaba usando las partes sftp de la biblioteca, ¡lo siento! –