2010-04-14 3 views
1

Я использую JSch для получения файлов с сервера SFTP, но я пытаюсь найти способ получить только самый старый файл и убедиться, что он в настоящее время не записывается. То, как я себя представляю себе, - это сначала найти, какой файл в указанной удаленной папке является самым старым. Затем я проверил размер файла, подожду x секунд (возможно, около 10, чтобы быть в безопасности), а затем снова проверьте его. Если размер файла не изменился, я загружаю файл и обрабатываю его. Однако я не знаю, как это сделать! Если кто-нибудь знает, как это сделать, или знает что-то другое, поддерживающее SFTP, у которого есть этот встроенный (я знаю, что Apache Commons делает, но только делает FTPS), было бы весьма полезно.Поиск размера файла и последнего изменения файла SFTP с использованием Java

Заранее спасибо.

ответ

14

Оказывается, что это вполне возможно в JSch, самая сложная часть - просто найти документацию. Код, который я использовал, ниже, надеюсь, кто-то еще найдет его полезным! (Я уверен, что есть оптимизаций, которые будут сделаны, я знаю, я знаю. Есть также переменные, которые определены в других местах, но, надеюсь, кто-нибудь, что это нужно будет в состоянии понять их!)

public static String oldestFile() { 
    Vector list = null; 
    int currentOldestTime; 
    int nextTime = 2140000000; //Made very big for future-proofing 
    ChannelSftp.LsEntry lsEntry = null; 
    SftpATTRS attrs = null; 
    String nextName = null; 
    try { 
     list = Main.chanSftp.ls("*.xml"); 
     if (list.isEmpty()) { 
      fileFound = false; 
     } 
     else { 
      lsEntry = (ChannelSftp.LsEntry) list.firstElement(); 
      oldestFile = lsEntry.getFilename(); 
      attrs = lsEntry.getAttrs(); 
      currentOldestTime = attrs.getMTime(); 
      for (Object sftpFile : list) { 
       lsEntry = (ChannelSftp.LsEntry) sftpFile; 
       nextName = lsEntry.getFilename(); 
       attrs = lsEntry.getAttrs(); 
       nextTime = attrs.getMTime(); 
       if (nextTime < currentOldestTime) { 
        oldestFile = nextName; 
        currentOldestTime = nextTime; 
       } 
      } 
      attrs = chanSftp.lstat(Main.oldestFile); 
      long size1 = attrs.getSize(); 
      System.out.println("-Ensuring file is not being written to (waiting 1 minute)"); 
      Thread.sleep(60000); //Wait a minute to make sure the file size isn't changing 
      attrs = chanSftp.lstat(Main.oldestFile); 
      long size2 = attrs.getSize(); 
      if (size1 == size2) { 
       System.out.println("-It isn't."); 
       fileFound = true; 
      } 
      else { 
       System.out.println("-It is."); 
       fileFound = false; 
      } 
     } 
    } catch (Exception ex) {ex.printStackTrace();} 
    return Main.oldestFile; 
} 
+3

Просто примечание: я написал несколько [JavaDoc для JSch] (http://epaul.github.com/jsch-documentation/simple.javadoc/). –

+0

Я не могу получить часть, через которую я могу получить размер файла из удаленного Unix. 'SftpATTRS' не является avaibale в моем файле jsch jar –

1

У меня нет прямого ответа на ваш вопрос, но похоже, что вы хотите сделать что-то похожее на reliable file transfer. Это часть более крупного проекта в грид-вычислениях, который теперь, по-видимому, организован here. Я не знаю, включает ли он функции безопасности или можно добавить их, но это проект с открытым исходным кодом.

1

Вы можете легко сделать это, используя edtFTPj/PRO, который поддерживает SFTP.

Просто введите список каталогов и отсортируйте их по дате. Если самая старая дата не находится за последние несколько минут, ее можно загрузить.

+0

Я забыл самую важную деталь: Это должно быть бесплатным! Спасибо за подсказку, хотя :) – ryantmer

-3

высчитывает размер папки на удаленном сервере просто вызывает путь к каталогу ftpFolderSize(ftpFolderSize,client) и передать объект FTPClient в качестве параметра. Он вернет размер папки .

Работает только для FTP.

import org.apache.commons.net.ftp.FTPClient; 

import org.apache.commons.net.ftp.FTPFile; 
import org.apache.commons.io.FileUtils; 

long dirSize = 0L; //global variable 

private long ftpFolderSize(String directoryPath,FTPClient client){ 

    try{ 
     client.changeWorkingDirectory(directoryPath); 
     FTPFile[] ftpFiles = client.listFiles(); 
     if(client.changeWorkingDirectory(directoryPath)) 
     { 
      for (FTPFile ftpFile : ftpFiles) { 
       if(ftpFile.isFile()){ 
        dirSize = dirSize+ftpFile.getSize();// file size is calculated 
       } 
       else if(ftpFile.isDirectory()) 
       { 
        dirSize = dirSize + 4096;//folder minimum size is 4kb 
        ftpFolderSize(directoryPath+"/"+ftpFile.getName(),client); 
       } 

      } 
     } 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return dirSize; 
} 
+1

Это не будет работать для SFTP (это другой протокол, чем FTP). –