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

问题描述 投票:0回答:5

我知道 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");
        }
    }
}
java file date jfilechooser
5个回答
42
投票

以下是在 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)
方法参数分别设置上次修改时间、上次访问时间和创建时间。


24
投票

Java 7 开始,您可以使用

java.nio.file.Files.setAttribute
creationTime
属性:

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

2
投票

我相信您有以下选择:

  1. 找到一个可以执行此操作并且可以从命令行调用的工具。然后您可以通过 Java 代码与其交互。
  2. 来自 MSDN File Times 的以下链接显示了任何工具如何执行此操作 - 特别注意功能
    GetFileTime
    SetFileTime

在这里我想你会很幸运:)在Google上搜索这些功能时我发现了一篇关于SO的帖子。 How to Discover a File's Creation Time with Java的这个答案(不是被接受的答案)似乎完全可以使用 JNA 和上述方法完成您想要的操作。如果确实如此,请再次投票赞成该答案:)

请不要介意标题,它也有一个设置创建时间的方法。我希望你能成功。


0
投票
寻找答案,该答案是跨平台的并保留其他时间戳......

public static boolean setCreationTime(final File f, final long creationTime_epoch70_ms) { try { final BasicFileAttributes attr = Files.readAttributes(f.toPath(), BasicFileAttributes.class); final FileTime lm = attr.lastModifiedTime(); final FileTime la = attr.lastAccessTime(); final BasicFileAttributeView view = Files.getFileAttributeView(f.toPath(), BasicFileAttributeView.class); view.setTimes(lm, la, FileTime.from(creationTime_epoch70_ms, TimeUnit.MILLISECONDS)); return true; } catch (final IOException e) { e.printStackTrace(); return false; } }
    

-4
投票
如果您使用 jdk >= 1.7,则应该搜索 java.nio

您也可以尝试这个(在 Macos Mavericks 上对我来说效果很好,并为我提供了两个不同的时间戳):

file.setLastModified(created.getTime()); //Older Timestamp file.setLastModified(updated.getTime()); //Newer Timestamp
    
© www.soinside.com 2019 - 2024. All rights reserved.