user263078
user263078

Reputation:

Setting file creation timestamp in Java

I know setting the creation timestamp doesn't exist in Java because Linux doesn't have it, but is there a way to set a file's (Windows) creation timestamp in Java? I have a basic modification timestamp editor I made right here.

import java.io.*;
import java.util.*;
import java.text.*;
import javax.swing.*;

public class chdt{
    static File file;
    static JFrame frame = new JFrame("Input a file to change");
    public static void main(String[] args) {
        try{

            final JFileChooser fc = new JFileChooser();
            fc.setMultiSelectionEnabled(false);

            //BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            //System.out.println("Enter file name with extension:");
            //String str = bf.readLine();
            JOptionPane.showMessageDialog(null, "Input a file to change.");
            frame.setSize(300, 200);

            frame.setVisible(true);

            int retVal = fc.showOpenDialog(frame);
            if (retVal == JFileChooser.APPROVE_OPTION) {
                file = fc.getSelectedFile();
                frame.setVisible(false);
            } else {
                JOptionPane.showMessageDialog(null, "3RR0RZ!  You didn't input a file.");
                System.exit(0);
            }

            //System.out.println("Enter last modified date in 'dd-mm-yyyy-hh-mm-ss' format:");
            //String strDate = bf.readLine();
            String strDate = JOptionPane.showInputDialog("Enter last modified date in 'dd-mm-yyyy-hh-mm-ss' format:");

            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss");
            Date date = sdf.parse(strDate);

            if (file.exists()){
                file.setLastModified(date.getTime());
                JOptionPane.showMessageDialog(null, "Modification is successful!");
            }
            else{
                JOptionPane.showMessageDialog(null, "File does not exist!  Did you accidentally it or what?");
            }
        }
        catch(Exception e){
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "3RR0RZ");
        }
    }
}

Upvotes: 29

Views: 32468

Answers (4)

ROMANIA_engineer
ROMANIA_engineer

Reputation: 56714

Starting from Java 7, you can use java.nio.file.Files.setAttribute and the creationTime attribute:

Path p = Paths.get("C:\\Users\\first.last\\test.txt");
try {
    Calendar c = Calendar.getInstance();
    c.set(2010, Calendar.MARCH, 20);
    Files.setAttribute(p, "creationTime", FileTime.fromMillis(c.getTimeInMillis()));
} catch (IOException e) {
    System.err.println("Cannot change the creation time. " + e);
}

Other attributes can be found here:

Name                  Type
-------------------------------
"lastModifiedTime"    FileTime
"lastAccessTime"      FileTime
"creationTime"        FileTime
"size"                Long
"isRegularFile"       Boolean
"isDirectory"         Boolean
"isSymbolicLink"      Boolean
"isOther"             Boolean
"fileKey"             Object

Upvotes: 25

harperska
harperska

Reputation: 707

Here is how you do it in Java 7 with the nio framework:

public void setFileCreationDate(String filePath, Date creationDate) throws IOException{

    BasicFileAttributeView attributes = Files.getFileAttributeView(Paths.get(filePath), BasicFileAttributeView.class);
    FileTime time = FileTime.fromMillis(creationDate.getTime());
    attributes.setTimes(time, time, time);

}

the BasicFileAttributeView.setTimes(FileTime, FileTime, FileTime) method arguments set the last modified time, last accessed time, and creation time respectively.

Upvotes: 44

Max Mustermann
Max Mustermann

Reputation: 351

You should search for java.nio if you are using jdk >= 1.7

You can also try this (worked well for me on Macos Mavericks and get me two different timestamps):

file.setLastModified(created.getTime()); //Older Timestamp
file.setLastModified(updated.getTime()); //Newer Timestamp

Upvotes: -4

user890904
user890904

Reputation:

I believe you have the following options:

  1. Find a tool that does this and is callable from the command line. Then you can interact with it from your java code.
  2. The following link from MSDN File Times shows how any tool would be doing it - especially note the functions GetFileTime and SetFileTime.

And here I guess you will be lucky :) Searching for those functions on Google I found a post here on SO. This answer (not the accepted one) to How to Discover a File's Creation Time with Java seems to do exactly what you want using JNA and the methods above. And if it does, then please upvote that answer one more time :)

Please don't mind the title it has a method to set the creation time too. I hope you will manage to get it working.

Upvotes: 2

Related Questions