2012-10-11 119 views
11

Me gustaría copiar un archivo al directorio remoto utilizando la biblioteca Jsch y el protocolo SFTP. Si el directorio en el host remoto no existe, entonces créelo.Use JSch para poner un archivo en el directorio remoto y si el directorio no existe, entonces créelo

En la documentación del API, http://epaul.github.com/jsch-documentation/javadoc/, me di cuenta en el método puesto que hay una especie de "modo", pero es sólo el modo de transferencia: - el modo de transferencia, una de RESUME, ADJUNT sobrescribir.

¿Hay una manera fácil de hacerlo sin tener que escribir mi propio código para verificar la existencia y luego crear un directorio recursivamente?

Respuesta

24

No es lo que yo sé. Yo uso el siguiente código para lograr la misma cosa:

String[] folders = path.split("/"); 
for (String folder : folders) { 
    if (folder.length() > 0) { 
     try { 
      sftp.cd(folder); 
     } 
     catch (SftpException e) { 
      sftp.mkdir(folder); 
      sftp.cd(folder); 
     } 
    } 
} 

donde sftp es el objeto ChannelSftp.

+0

Esto funciona muy bien. Aunque formatee el código correctamente sin esos espacios molestos alrededor de los métodos. jajaja bromeando :) –

3

La respuesta anterior puede no funcionar si se conecta al servidor remoto con varios subprocesos. Tenga en cuenta, por ejemplo, que cuando sftp.cd ejecuta no hay una carpeta llamada "carpeta", pero al ejecutar sftp.mkdir (carpeta) en catch clause la otra cadena lo creó. Mejor manera (por supuesto para los servidores remotos basados ​​en Unix) es usar ChannelExec y crear directorios anidados usando el comando "mkdir -p".

+1

Este no es un buen consejo. Una cuenta puede limitarse a SFTP y bloquearse para realizar otras operaciones SSH. Y usar SSH en lugar de SFTP para crear un directorio no resuelve la condición de carrera de que otro proceso pueda estar alterando el sistema de archivos. Un cliente de SFTP solo tiene que ser resiliente al hecho de que otro proceso podría estar modificando el sistema de archivos. – Kenster

5

Así es como compruebo la existencia del directorio en JSch.

Crear directorio si no dir ont existen

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); 
} 
2

misma solución como un método abstracto listo con características adicionales:

  • de trabajo con rutas que contienen nombres de archivo;
  • eliminar si el mismo archivo ya existe.

    public boolean prepareUpload(
        ChannelSftp sftpChannel, 
        String path, 
        boolean overwrite) 
        throws SftpException, IOException, FileNotFoundException { 
    
        boolean result = false; 
    
        // Build romote path subfolders inclusive: 
        String[] folders = path.split("/"); 
        for (String folder : folders) { 
        if (folder.length() > 0 && !folder.contains(".")) { 
         // This is a valid folder: 
         try { 
         sftpChannel.cd(folder); 
         } catch (SftpException e) { 
         // No such folder yet: 
         sftpChannel.mkdir(folder); 
         sftpChannel.cd(folder); 
         } 
        } 
        } 
    
        // Folders ready. Remove such a file if exists:  
        if (sftpChannel.ls(path).size() > 0) { 
        if (!overwrite) { 
         System.out.println(
         "Error - file " + path + " was not created on server. " + 
         "It already exists and overwriting is forbidden."); 
        } else { 
         // Delete file: 
         sftpChannel.ls(path); // Search file. 
         sftpChannel.rm(path); // Remove file. 
         result = true; 
        } 
        } else { 
        // No such file: 
        result = true; 
        } 
    
        return result; 
    } 
    
Cuestiones relacionadas