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

Попытка создать простой плагин, который просто подключается к 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 или кто-нибудь может указать мне, что я делаю неправильно. Благодарю.

 Ryan30 сент. 2010 г., 01:56
да.............
 Thorbjørn Ravn Andersen29 сент. 2010 г., 22:09
GetTImestamp () сообщает правильные значения для всех файлов?

Ответы на вопрос(2)

Решение Вопроса

ы проще написать метод сортировки:

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, оригинальная временная метка файла может быть сохранена.

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

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

public void put(File file) {
    // upload code
    FTPFile ftpFile = getJustUploadedFile(file);
    ftpFile.setTimestamp(new Calendar()); // Now! 
}
 Ryan29 сент. 2010 г., 21:47
Да, компаратор тоже не работает, я исследую FTP-клиент, чтобы увидеть, что он делает, спасибо за информацию.
 Thorbjørn Ravn Andersen29 сент. 2010 г., 22:07
оригинальная отметка времениможет быть сохраненным.
 Benoit Courtine29 сент. 2010 г., 22:22
Это правда: это зависит от клиента FTP. Я отредактировал свой пост, чтобы включить вашу точность. Большое спасибо.

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

FTPFile choice = null;

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

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

FTPFile choice = files[0];

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

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

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

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

 BalusC29 сент. 2010 г., 21:51
Итак, вы сравниваете время в разных местах (в Java и в каком-либо инструменте FTP-менеджера)? Вы проверили метку времени всех файлов внутриfor (FTPFile file : files) цикл как предложено в моем ответе? Инструмент FTP-менеджера может использовать другой часовой пояс.
 Ryan29 сент. 2010 г., 21:32
Тот же результат, добавив время в выводе системы, показывает Ср, 29 сентября 15:28:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2010 года, то есть в то же время, что FTP показывает 29.09.2010 15:28:00. Последний файл на самом деле 29.09.2010 19:23:00, и между этими датами находится около 50 файлов.
 Ryan30 сент. 2010 г., 01:59
Это началось с того, что я просто отобразил имя файла, чтобы я мог дважды проверить, был ли он правильным файлом, прежде чем я продолжил что-либо, низкий уровень, и вот, это произошло. Времена все совпадают в коде. Визуально, когда вы выводите время, а затем сравниваете с тем, что вы видите визуально с файлом, это то же самое время, только одно находится в военное время, а другое нет. Но в коде они все одинаковые значения.

Ваш ответ на вопрос