2012-10-11 14 views
11

Vorrei copiare un file nella directory remota usando la libreria Jsch e il protocollo SFTP. Se la directory sull'host remoto non esiste, quindi crearla.Utilizzare JSch per inserire un file nella directory remota e se la directory non esiste, quindi crearla

Nel documento API, http://epaul.github.com/jsch-documentation/javadoc/, ho notato nel metodo put che v'è una sorta di "modo" ma è solo la modalità di trasferimento: - la modalità di trasferimento, uno dei RESUME, APPEND, sovrascrivere.

C'è un modo semplice per farlo senza dover scrivere il mio codice per verificare l'esistenza e quindi creare una directory in modo ricorsivo?

risposta

24

Non per quanto ne so. Io uso il seguente codice per ottenere la stessa 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); 
     } 
    } 
} 

dove sftp è l'oggetto ChannelSftp.

+0

Questa grande opera. Anche se si prega di formattare il codice correttamente senza quegli spazi fastidiosi intorno ai metodi !! hahaha scherzando :) –

3

La risposta sopra potrebbe non funzionare se ci si connette al server remoto con più thread. Si consideri, ad esempio, quando sftp.cd esegue che non ci sia una cartella denominata "cartella", ma quando si esegue sftp.mkdir (cartella) nella clausola catch l'altro thread lo crea. Il modo migliore (ovviamente per i server remoti basati su unix) è utilizzare ChannelExec e creare directory nidificate usando il comando "mkdir -p".

+1

Questo non è un buon consiglio. Un account può essere limitato a SFTP e bloccato dall'esecuzione di altre operazioni SSH. E usare SSH invece di SFTP per creare una directory non risolve la condizione di competizione che un altro processo potrebbe alterare il filesystem. Un client SFTP deve solo essere resiliente al fatto che un altro processo potrebbe modificare il filesystem. – Kenster

5

Ecco come controllo la presenza della directory in JSch.

Crea directory se non dir ont esistono

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

Stessa soluzione come un metodo astratto pronto con funzioni extra:

  • lavoro con percorsi che contengono i nomi dei file;
  • rimuovere se lo stesso file esiste già.

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