java 从 ftp 获取最新文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3824983/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 03:33:01  来源:igfitidea点击:

get latest file from ftp

javaftp

提问by Ryan

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.

尝试创建一个简单的插件,只需连接到 ftp 站点,查找最新文件然后下载它。但是,它没有获取最新的文件。

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

我正在使用 org.apache.commons.net.ftp.ftpclient 做所有事情。

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.

它获取文件列表,然后返回一个文件,它只是不是最新的文件。有没有其他方法可以使用 FTPClient 比较文件修改日期,或者任何人都可以指出我做错了什么。谢谢。

采纳答案by Benoit Courtine

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

我将创建一个比较器,而不是您的“lastFileModified”方法。编写 sort 方法会更容易:

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:

然后,获取“最后一个”FTPFile 就容易多了:

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.

回到您的问题:“lastModified”时间戳未链接到 FTP 上传顺序。当您通过 FTP 协议上传文件时,可能会保留文件的原始时间戳。

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

因此,如果文件 1 比文件 2 旧,您的方法将始终返回文件 2,即使文件 2 在 FTP 服务器上的文件 1 之前上传。

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:

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

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

回答by BalusC

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.

如果第一个文件是最新修改的文​​件,则该方法将返回null,从而导致潜在的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 forloop in the method:

如果它仍然没有返回预期的文件,那么很可能有问题的文件根本没有预期的最后修改日期。将这样的内容添加到for方法中的循环中:

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

And look closer.

并仔细观察。