设置/更改的ctime或“改变时间”上的文件属性(Setting/changing the ctim

2019-08-31 16:10发布

我想使用改变的时间戳的元数据中的文件在Java中java.nio.Files类。

我想改变这一切Linux的3 / ext4的时间戳(最后修改,访问和改变)。

我能够改变前两个时间戳字段如下:

Files.setLastModifiedTime(pathToMyFile, myCustomTime);
Files.setAttribute(pathToMyFile, "basic:lastAccessTime", myCustomTime);

然而,我无法修改的最后一次变更:时间上的文件。 另外,还涉及有中提到的没有变化时间戳的文件 。 最近的可用属性是creationTime ,我尝试没有成功。

关于如何修改任何想法Change:根据Java的定制时间戳的文件元数据?

谢谢!

Answer 1:

我能够用两种不同的方法来修改的ctime:

  1. 改变内核,这样ctime比赛mtime
  2. 编写一个简单的(但哈克)shell脚本。

第1种方法:改变内核。

我调整了短短几行中KERNEL_SRC/fs/attr.c此修改更新的ctime匹配每当修改时间是在修改时间“明确定义”。

有许多方法来“明确定义”的的修改时间,例如:

在Linux中:

touch -m --date="Wed Jun 12 14:00:00 IDT 2013" filename

在Java(使用Java 6或7,并且据推测其他):

long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH;
File myFile = new File(myPath);
newmeta.setLastModified(newModificationTime);

这里是改变KERNEL_SRC/fs/attr.cnotify_change功能:

    now = current_fs_time(inode->i_sb);

    //attr->ia_ctime = now;  (1) Comment this out
    if (!(ia_valid & ATTR_ATIME_SET))
        attr->ia_atime = now;
    if (!(ia_valid & ATTR_MTIME_SET)) {
        attr->ia_mtime = now;
    }
    else { //mtime is modified to a specific time. (2) Add these lines
        attr->ia_ctime = attr->ia_mtime; //Sets the ctime
        attr->ia_atime = attr->ia_mtime; //Sets the atime (optional)
    }

(1)本线,未注释,将在改变该文件更新的ctime到当前时钟时间。 我们不希望出现这种情况,因为我们要设定的ctime自己。 因此,我们注释此行了。 (这不是必须的)

(2)这是真正的解决方案的关键所在。 该notify_change功能的文件后执行已经改变,其中时间元数据需要更新。 如果没有指定的mtime,然后将修改时间设置为当前时间。 否则,如果修改时间被设置为一个特定的值,我们还可以设置的ctime和atime的该值。

第二个方法:简单(但哈克)shell脚本。

简要说明:1)更改系统时间到你的目标时间2)对文件执行在chmod,文件的ctime现在反映目标时间3)还原系统时间回来。

changectime.sh

#!/bin/sh
now=$(date)
echo $now
sudo date --set="Sat May 11 06:00:00 IDT 2013"
chmod 777 $1
sudo date --set="$now"

运行此如下:./changectime.sh MYFILE

该文件的的ctime现在将反映在文件中的时间。

当然,你可能不希望与777级权限的文件。 确保您在使用它之前修改此脚本您的需求。



Answer 2:

适应这个答案对你的情况:

// Warning: Disk must be unmounted before this operation
String disk = "/dev/sda1";
// Update ctime
Runtime.getRuntime().exec("debugfs -w -R 'set_inode_field "+pathToMyFile+" ctime "+myCustomTime+"' "+disk);
// Drop vm cache so ctime update is reflected
Runtime.getRuntime().exec("echo 2 > /proc/sys/vm/drop_caches");

我怀疑我们将看到标准的Java API中的一种便利的方法来做到这一点,因为无论Linux操作系统(男子触摸 )也不支持Windows(MSDN上GetFileTime功能),方便地存取到这个领域。 原生系统调用只授予创建/访问/修改时间戳的访问,也是如此的Java。



文章来源: Setting/changing the ctime or “Change time” attribute on a file