9
votes

Comment puis-je définir une durée de création de fichier avec Ruby sur Mac OS?

J'essaie de définir le temps de création du système de fichiers pour un fichier sur Mac OS à l'aide d'un script Ruby.

sur Mac OS X Le "CTTIM" représente la dernière modification de l'inode plutôt que le temps de création de fichier, ainsi que Utiliser le fichier de Ruby.UTIME () pour définir CTime ne vous aidera pas. p>

Utilisation de cet indice [ http://ininentialien.com/2008/12/18/file_create_date_in_ruby_on_macs ] Je peux récupérer le temps de création d'un fichier: p> xxx pré>

... mais tout Idée sur la façon de la définir en utilisant Ruby? P>

- MISE À JOUR - P>

OK, je pense que je peut FORT> Faites-le en fait avec . utime code> dans ruby. p>

Même si le CTTI est techniquement utilisé par Mac OS pour suivre le temps de création de fichier, lorsque vous utilisez utime code> pour mettre à jour le em> (avec le MTTIM EM>, qui doit être défini simultanément) le système de fichiers apparaît à mettre à jour par magie la durée de création selon kmditemContentCreationDate .

so Pour définir nom de fichier em> à un article de 1er oct. 2010 et un MTIME du 2 oct. 2010: P>

File.utime(Time.strptime('011010', '%d%m%y'), Time.strptime('021010', '%d%m%y'), filename)


3 commentaires

Vous voudrez peut-être publier votre «mise à jour» que votre solution de réponse, de sorte que cette question n'a donc pas besoin de rester ouverte (et «sans réponse»)


Vous comprenez que cela n'est pas portable. Linux ne supporte pas de stocker un temps de création. Un temps de création n'est également pas un temps de création, il s'agit de «changement» en fonction du répertoire, pas pour le fichier lui-même. Cela pourrait l'expliquer: Stackoverflow.com/a/4009369/128421


Réglage des heures de fichier à l'aide de utime ne modifie pas la valeur renvoyée à l'aide de MDLS -Name KMDItemContentCreationDate -raw .


4 Réponses :


3
votes

Vous avez donc définitivement une solution de rubis pur fonctionnant, mais comme ceci est OS X, êtes-vous opposé à EXEC () ou système () et simplement en utilisant simplement touchez ? Dans votre cas, je préférerais presque: xxx

si pour aucune autre raison que la clarté.


1 commentaires

toucher n'utilise pas le même mécanisme que MDLS -Name kmDItemContentCreationDate -raw fait.



15
votes

Il y a une solution rubis avec la méthode utime . Mais vous devrez définir le temps de modification (MTIME) et l'heure d'accès (ATime) à la fois . Si vous souhaitez garder l'heure d'accès, vous pouvez utiliser: xxx

voir Ruby Core Documentation aussi.


1 commentaires

Si vous exécutez stats -s -s sur ce fichier, vous verrez que cela ne met pas à jour la propriété st_ctime .



2
votes

Cela fonctionne pour moi de mettre à jour le temps de création sur le système d'exploitation X 10.11.1:

system "SetFile -d '#{time.strftime "%m/%d/%Y %H:%M:%S"}' #{file}"


0 commentaires

0
votes

Ruby utilise l'appel du système des utiles pour modifier les temps de fichier.

lire la page man destinations explique ce qui se passe:

int UTIMES (Cons-Char * PATH, ConstTr struct Timeval * fois); .. Si les temps sont non nuls, il est supposé indiquer un tableau de deux timbres structures. L'heure d'accès est définie sur la valeur du premier élément, et le temps de modification est défini sur la valeur du deuxième élément. Pour systèmes de fichiers qui prennent en charge les temps de naissance (création) (tels que UFS2), le Le temps de naissance sera réglé sur la valeur du deuxième élément si la seconde L'élément est plus vieux que le temps de naissance actuellement défini. Mettre à la fois une naissance temps et délai de modification, deux appels sont nécessaires; le premier à régler le temps de naissance et la seconde pour définir la modification (probablement plus récente) temps. ...

Donc, Carrez uniquement SEULEMENT Mise à jour en arrière dans le temps.


0 commentaires