在Java中设置文件创建时间戳

27
我知道在Java中设置创建时间戳是不存在的,因为Linux没有这个功能,但是在Java中有没有一种方式可以设置文件(Windows)的创建时间戳呢? 我这里有一个基本的修改时间戳编辑器。
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");
        }
    }
}
4个回答

41

以下是使用Java 7和nio框架的方法:

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

}

BasicFileAttributeView.setTimes(FileTime, FileTime, FileTime) 方法的参数分别设置了最后修改时间、最后访问时间和创建时间。


这个能否设置最后修改时间比创建时间更早? - peterk
1
设置创建时间在 macOS 上无法工作,请参见 https://bugs.openjdk.java.net/browse/JDK-8151430 - Loyea

24

Java 7开始,您可以使用java.nio.file.Files.setAttributecreationTime属性:

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

其他属性可以在此处找到:

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

7
遗憾的是,在某些Unix系统上(例如OS X,即使它应该在HFS上受到支持),设置创建时间会默默失败。如果您想确保已实际设置,请在写入后进行读取并检查! - Hendrik
2
对我来说,在Linux上使用ext3和ext4时,它会默默地失败,因为这些文件系统不支持creationDates。在Java中读取creationDate将返回lastModifiedDate! - Daniel
不支持Linux操作系统。 - Maik

2
我相信你有以下几个选项:
  1. 找到一个可从命令行调用的工具,然后您可以从Java代码中与其交互。
  2. 下面的MSDN链接文件时间显示了任何工具将如何执行此操作-特别注意函数GetFileTimeSetFileTime

在这里我想你会很幸运 :) 在Google上搜索这些函数,我在这里找到了一个SO帖子。这个答案(不是被接受的答案)回答了如何使用Java发现文件的创建时间,似乎正是您想要使用JNA和上述方法来完成的。如果是这样,请再次为该答案点赞 :)

请不要介意它的标题,它还有一种设置创建时间的方法。我希望您能成功地使其工作。


-4
如果您使用的是jdk >= 1.7,那么您应该搜索java.nio。
您也可以尝试这个(在Macos Mavericks上为我工作得很好,并获得了两个不同的时间戳):
file.setLastModified(created.getTime()); //Older Timestamp
file.setLastModified(updated.getTime()); //Newer Timestamp

3
这如何设置文件的创建时间? - Danny Rancher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接