получить последний файл с FTP - PullRequest
       0

получить последний файл с FTP

8 голосов
/ 29 сентября 2010

Попытка создать простой плагин, который просто подключается к FTP-сайту, ищет последний файл и затем загружает его. Однако он не получает последний файл.

Я использую org.apache.commons.net.ftp.ftpclient для всего.

Вот мой код

public static void main(String[] args)
  {
  FTPClient client = new FTPClient();
  try
  {
     client.connect(host);
     client.login(user, pwd);
     FTPFile[] files = client.listFiles();
     FTPFile lastFile = lastFileModified(files); 
     System.out.println(lastFile.getName());
     client.disconnect();
  }
  catch(SocketException e)
  {
     // TODO Auto-generated catch block
     e.printStackTrace();
  }
  catch(IOException e)
  {
     // TODO Auto-generated catch block
     e.printStackTrace();
  }

}

public static FTPFile lastFileModified(FTPFile[] files) {
  Date lastMod = files[0].getTimestamp().getTime();
  FTPFile choice = null;
  for (FTPFile file : files) {
          if (file.getTimestamp().getTime().after(lastMod)) {
                  choice = file;
                  lastMod = file.getTimestamp().getTime();
          }
   }
   return choice;
}

Он получает список файлов, а затем возвращает файл, он просто не самый последний файл. Есть ли другой способ сравнить даты изменения файла с помощью FTPClient или кто-нибудь может указать мне, что я делаю неправильно. Спасибо.

Ответы [ 2 ]

7 голосов
/ 29 сентября 2010

Вместо вашего метода "lastFileModified" я бы создал Comparator.Было бы проще написать метод сортировки:

public class LastModifiedComparator implements Comparator<FTPFile> {

    public int compare(FTPFile f1, FTPFile f2) {
        return f1.getTimestamp().compareTo(f2.getTimeStamp());
    }
}

Затем, получить «последний» FTPFile гораздо проще:

public FTPFile getMaxLastModified(FTPFile[] ftpFiles) {
    return Collections.max(Arrays.asList(ftpFiles), new LastModifiedComparator());
}

Вернемся к вашей проблеме:метка времени lastModified не связана с порядком загрузки по FTP.Когда вы загружаете файл по протоколу FTP, оригинальная временная метка файла может быть сохранена.

Таким образом, если файл1 старше файла2, ваш метод всегда возвращает файл2, даже если файл2 загружен до того, как файл1 будетFTP-сервер.

Я думаю, что невозможно определить последний загруженный файл.Эта информация не сохраняется протоколом FTP.Вы можете сделать это, только если вы перегрузите метод «put» вашего FTP-клиента:

public void put(File file) {
    // upload code
    FTPFile ftpFile = getJustUploadedFile(file);
    ftpFile.setTimestamp(new Calendar()); // Now! 
}
0 голосов
/ 29 сентября 2010

Я вижу только одну ошибку:

FTPFile choice = null;

Если первый файл был последним измененным файлом, то метод вернул бы null, что привело бы к потенциальному NullPointerException.

Измените его на

FTPFile choice = files[0];

и логика должна быть правильной.

Если он все еще не возвращает ожидаемый файл, то, скорее всего, у рассматриваемого файла просто нет ожидаемой даты последнего изменения. Добавьте что-то вроде этого в цикл for в методе:

System.out.println(file.getTimestamp().getTime() + " - " + file.getName());

И присмотритесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...