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

2.7k views Asked by At

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 when its saved on my machine. Do anyone have a suggestion for how to solve this?

3

There are 3 answers

0
Jan-Terje Sørensen On

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
Knut On

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
Martin Prikryl On

When downloading a list of files, like all files returned by by FTPClient.mlistDir or FTPClient.listFiles, use the timestamp returned with the listing to update timestamp 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());
}