2 つの異なる方法で ctime を変更できました:
<オール>ctime
になるようにカーネルを変更する mtime
に一致 第 1 の方法:カーネルを変更する。
KERNEL_SRC/fs/attr.c
の数行だけ微調整しました この変更により、mtime が「明示的に定義されている」場合は常に、mtime と一致するように ctime が更新されます。
mtime を「明示的に定義」する方法は多数あります。例:
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.c
への変更は次のとおりです。 notify_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 が指定されていない場合、mtime は現在の時刻に設定されます。それ以外の場合、mtime が特定の値に設定されている場合は、ctime と atime もその値に設定します。
2 番目の方法:シンプルな (しかしハッキーな) シェル スクリプト
簡単な説明:
<オール>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 のファイルは必要ないでしょう。このスクリプトを使用する前に、必要に応じて変更してください。
この回答をあなたのケースに適応させる:
// 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");
Linux (man touch ) も Windows (GetFileTime 関数) を使用すると、このフィールドに簡単にアクセスできます。ネイティブ システム コールは、タイムスタンプの作成/アクセス/変更へのアクセスのみを提供します。Java もそうです。