Установка метки времени создания файла в Java

Я знаю, что установка временной метки создания не существует в Java, потому что в Linux ее нет, но есть ли способ установить временную метку создания файла (Windows) в Java? У меня есть базовый редактор меток времени модификации, который я сделал прямо здесь.

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

person Community    schedule 08.02.2012    source источник


Ответы (4)


Я считаю, что у вас есть следующие варианты:

  1. Найдите инструмент, который делает это и вызывается из командной строки. Затем вы можете взаимодействовать с ним из своего кода Java.
  2. Следующая ссылка из файла MSDN Times показывает, как это делает любой инструмент — особенно обратите внимание на функции GetFileTime и SetFileTime.

И здесь, я думаю, вам повезет :) В поисках этих функций в Google я нашел сообщение здесь, на SO. Этот ответ (не принятый) на Как узнать время создания файла с помощью Java, кажется, делает именно то, что вы хотите, используя JNA и описанные выше методы. И если это так, то, пожалуйста, проголосуйте за этот ответ еще раз :)

Пожалуйста, не обращайте внимания на название, у него также есть способ установить время создания. Надеюсь, вам удастся заставить его работать.

person Community    schedule 08.02.2012

Вот как вы это делаете в 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) задают время последнего изменения, время последнего доступа и время создания соответственно.

person harperska    schedule 12.02.2015
comment
Хм, это позволяет установить время последнего изменения ‹ (ранее), чем время создания? ??? - person peterk; 20.02.2021

Начиная с 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
person Elrond_EGLDer    schedule 03.06.2016
comment
К сожалению, в некоторых Unix-системах (например, в OS X) установить время создания не удается, хотя он должен поддерживаться в HFS. Если вы хотите быть уверены, что он действительно был установлен, прочитайте после того, как вы написали, и проверьте! - person Hendrik; 08.09.2016
comment
У меня на линуксе с ext3 и ext4 он молча провалился, потому что эти ФС просто не поддерживают дату создания. Чтение createDate в Java вернет lastModifiedDate! - person Daniel; 29.11.2018

Вам следует искать java.nio, если вы используете jdk >= 1.7

Вы также можете попробовать это (у меня хорошо сработало на Macos Mavericks и дало мне две разные метки времени):

file.setLastModified(created.getTime()); //Older Timestamp
file.setLastModified(updated.getTime()); //Newer Timestamp
person Max Mustermann    schedule 07.03.2014
comment
Как это устанавливает время создания файла? - person Danny Rancher; 22.03.2014