从ftp获取最新文件

时间:2010-09-29 19:07:36

标签: java 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比较文件修改日期,或者任何人都可以指出我正在做错的方向。感谢。

2 个答案:

答案 0 :(得分:7)

我会创建一个Comparator,而不是你的“lastFileModified”方法。编写排序方法会更容易:

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在FTP服务器上的file1之前上传,您的方法也将始终返回file2。

我认为无法确定上次上传的文件。 FTP协议不存储此信息。 只有在重载FTP客户端的“put”方法时才能这样做:

public void put(File file) {
    // upload code
    FTPFile ftpFile = getJustUploadedFile(file);
    ftpFile.setTimestamp(new Calendar()); // Now! 
}

答案 1 :(得分:0)

我只看到一个错误:

FTPFile choice = null;

如果第一个文件是最新修改的文​​件,则该方法将返回null,从而导致潜在的NullPointerException

将其更改为

FTPFile choice = files[0];

逻辑应该是正确的。

如果它仍然没有返回预期的文件,则很可能该文件根本没有预期的最后修改日期。将类似的内容添加到方法中的for循环中:

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

仔细观察。