2012-10-11 14 views
11

Chciałbym skopiować plik do zdalnego katalogu przy użyciu biblioteki Jsch i protokołu SFTP. Jeśli katalog na zdalnym hoście nie istnieje, utwórz go.Użyj JSch, aby umieścić plik w katalogu zdalnym, a jeśli katalog nie istnieje, utwórz go

W doc API, http://epaul.github.com/jsch-documentation/javadoc/, zauważyłem w metodzie put, że istnieje rodzaj „trybie”, ale to jest tylko tryb transferu: - tryb transferu, jeden z CV, dodać, nadpisywanie.

Czy istnieje prosty sposób, aby to zrobić, bez konieczności pisania własnego kodu, aby sprawdzić istnienie , a następnie utworzyć rekursywnie katalog?

Odpowiedz

24

Nie tak daleko, jak wiem. Używam następujący kod, aby osiągnąć to samo:

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

gdzie sftp jest przedmiotem ChannelSftp.

+0

to działa świetnie. Chociaż poprawnie sformatuj kod bez irytujących przestrzeni wokół metod! hahaha żartuje :) –

3

Powyższa odpowiedź może nie działać, jeśli łączysz się ze zdalnym serwerem z wieloma wątkami. Rozważmy na przykład, kiedy sftp.cd wykonuje, nie ma folderu o nazwie "folder", ale podczas wykonywania sftp.mkdir (folder) w klauzuli catch inny wątek go utworzył. Lepszym sposobem (oczywiście dla zdalnych serwerów opartych na Uniksie) jest użycie ChannelExec i tworzenie zagnieżdżonych katalogów za pomocą komendy "mkdir -p".

+1

To nie jest dobra rada. Konto może być ograniczone do SFTP i zablokowane do wykonywania innych operacji SSH. Używanie SSH zamiast SFTP do utworzenia katalogu nie rozwiązuje problemu wyścigu, który może zmienić inny system plików. Klient SFTP musi być odporny na to, że inny proces może modyfikować system plików. – Kenster

5

W ten sposób sprawdzam istnienie katalogu w JSch.

Tworzenie katalogu dir jeśli nie ont istnieć

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

samo rozwiązanie jako gotowy abstrakcyjnej metody z dodatkowych funkcji:

  • pracy ze ścieżkami, które zawierają nazwy plików;
  • usunąć, jeśli ten sam plik już istnieje.

    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; 
    } 
    
Powiązane problemy