J'ai pu modifier le ctime avec deux méthodes différentes :
- Modification du noyau pour que
ctime
correspond aumtime
- Écrire un script shell simple (mais hacky).
1ère méthode :changer de noyau.
J'ai modifié quelques lignes dans KERNEL_SRC/fs/attr.c
Cette modification met à jour le ctime pour qu'il corresponde au mtime chaque fois que le mtime est "défini explicitement".
Il existe de nombreuses façons de "définir explicitement" le mtime, par exemple :
Sous Linux :
touch -m --date="Wed Jun 12 14:00:00 IDT 2013" filename
En Java (en utilisant Java 6 ou 7, et probablement d'autres) :
long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH;
File myFile = new File(myPath);
newmeta.setLastModified(newModificationTime);
Voici le passage à KERNEL_SRC/fs/attr.c
dans le notify_change
fonction :
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) Cette ligne, non commentée, mettrait à jour le ctime à l'heure actuelle de l'horloge lors d'une modification du fichier. Nous ne voulons pas cela, car nous voulons définir nous-mêmes le ctime. Ainsi, nous commentons cette ligne. (Ce n'est pas obligatoire)
(2) C'est vraiment le nœud de la solution. Le notify_change
La fonction est exécutée après qu'un fichier a été modifié, où les métadonnées de temps doivent être mises à jour. Si aucun mtime n'a été spécifié, le mtime est défini sur l'heure actuelle. Sinon, si le mtime a été défini sur une valeur spécifique, nous définissons également le ctime et le atime sur cette valeur.
2ème méthode :script shell simple (mais hacky).
Brève explication :
- Modifier l'heure système à votre heure cible
- Effectuez un chmod sur le fichier, le fichier ctime reflète maintenant l'heure cible
- Revenir à l'heure système.
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"
Exécutez ceci comme suit :./changectime.sh MONFICHIER
Le ctime du fichier reflétera désormais l'heure dans le fichier.
Bien sûr, vous ne voulez probablement pas le fichier avec les autorisations 777. Assurez-vous de modifier ce script selon vos besoins avant de l'utiliser.
Adaptant cette réponse à votre cas :
// 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");
Je doute que nous verrons une méthode pratique dans l'API Java standard pour le faire, car ni Linux (man touch ) ni Windows (GetFileTime fonction sur MSDN) permettent d'accéder facilement à ce champ. Les appels système natifs ne donnent accès qu'à la création/l'accès/la modification des horodatages, tout comme Java.