get latest file from ftp

2019-02-21 19:03发布

问题:

Trying to create a simple plugin that simply connects to an ftp site, looks up the latest file and then downloads it. However, it isn't getting the latest file.

I'm using the org.apache.commons.net.ftp.ftpclient for everything.

Here is my code

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

It's getting the list of files, and then returning a file, it just isn't the latest file. Is there any other way to compare file modification dates using FTPClient or can anyone point me in a direction on what I'm doing wrong. Thanks.

回答1:

Instead of your "lastFileModified" method, I would create a Comparator. It would be easier to write the sort method:

public class LastModifiedComparator implements Comparator<FTPFile> {

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

Then, getting the "last" FTPFile is much easier:

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

To come back to your problem: the "lastModified" timestamp is not linked to the FTP upload order. When you upload a file through the FTP protocol, the original timestamp of the file may be preserved.

So, if file1 is older than file2, your method will always return file2, even if file2 is uploaded before file1 on the FTP server.

I think that it is impossible to determine the last uploaded file. This information is not stored by the FTP protocol. You can do that only if you overload the "put" method of your FTP client:

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


回答2:

I see only one mistake:

FTPFile choice = null;

If the first file were the latest modified file, then the method would return null, causing a potential NullPointerException.

Change it to

FTPFile choice = files[0];

and the logic should be right.

If it still doesn't return the expected file, then most likely the file in question simply doesn't have the expected last modified date. Add something like this to the for loop in the method:

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

And look closer.



标签: java ftp