How to preserve date modified when retrieving file using Apache FTPClient?

前端 未结 3 1112
情歌与酒
情歌与酒 2021-01-14 02:36

I am using org.apache.commons.net.ftp.FTPClient for retrieving files from a ftp server. It is crucial that I preserve the last modified timestamp on the file wh

相关标签:
3条回答
  • 2021-01-14 03:16

    This is how I solved it:

    public boolean retrieveFile(String path, String filename, long lastModified) throws IOException {
        File localFile = new File(path + "/" + filename);
        OutputStream outputStream = new FileOutputStream(localFile);
        boolean success = client.retrieveFile(filename, outputStream);
        outputStream.close();
        localFile.setLastModified(lastModified);
        return success;
    }
    

    I wish the Apache-team would implement this feature.

    This is how you can use it:

    List<FTPFile> ftpFiles = Arrays.asList(client.listFiles());
    for(FTPFile file : ftpFiles) {
        retrieveFile("/tmp", file.getName(), file.getTimestamp().getTime());
    }
    
    0 讨论(0)
  • 2021-01-14 03:21

    You can modify the timestamp after downloading the file.

    The timestamp can be retrieved through the LIST command, or the (non standard) MDTM command.

    You can see here how to do modify the time stamp: that: http://www.mkyong.com/java/how-to-change-the-file-last-modified-date-in-java/

    0 讨论(0)
  • 2021-01-14 03:33

    When download list of files, like all files returned by by FTPClient.mlistDir or FTPClient.listFiles, use the timestamp returned with the listing to update timestemp of local downloaded files:

    String remotePath = "/remote/path";
    String localPath = "C:\\local\\path";
    
    FTPFile[] remoteFiles = ftpClient.mlistDir(remotePath);
    for (FTPFile remoteFile : remoteFiles) {
        File localFile = new File(localPath + "\\" + remoteFile.getName());
        
        OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(localFile));
        if (ftpClient.retrieveFile(remotePath + "/" + remoteFile.getName(), outputStream))
        {
            System.out.println("File " + remoteFile.getName() + " downloaded successfully.");
        }
        outputStream.close();
        
        localFile.setLastModified(remoteFile.getTimestamp().getTimeInMillis());
    }
    

    When downloading a single specific file only, use FTPClient.mdtmFile to retrieve the remote file timestamp and update timestamp of the downloaded local file accordingly:

    File localFile = new File("C:\\local\\path\\file.zip");
    FTPFile remoteFile = ftpClient.mdtmFile("/remote/path/file.zip");
    if (remoteFile != null)
    {
        OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(localFile));
        if (ftpClient.retrieveFile(remoteFile.getName(), outputStream))
        {
            System.out.println("File downloaded successfully.");
        }
        outputStream.close();
    
        localFile.setLastModified(remoteFile.getTimestamp().getTimeInMillis());
    }
    
    0 讨论(0)
提交回复
热议问题