Wie kann ich unter Mac OS eine Dateierstellungszeit mit Ruby einstellen?

8

Ich versuche, die Dateisystem-Erstellungszeit für eine Datei unter Mac OS mit einem Ruby-Skript festzulegen.

Unter Mac OS X steht "ctime" für die letzte Änderung der Inode und nicht für die Erstellungszeit der Datei. Die Verwendung von ruby's File.utime () zur Einstellung von ctime hilft also nicht.

Mit diesem Hinweis [ Ссылка ] kann ich die Erstellungszeit einer Datei abrufen:

%Vor%

... aber irgendeine Idee, wie man es mit Ruby setzt?

- AKTUALISIEREN -

Okay, ich denke ich kann das tatsächlich mit File.utime in Ruby machen.

Obwohl die ctime von Mac OS technisch nicht dazu verwendet wird, die Erstellungszeit von Dateien zu verfolgen, wenn Sie utime verwenden, um ctime zu aktualisieren (zusammen mit mtime ), welches gleichzeitig gesetzt werden muss) das Dateisystem scheint auch die Erstellungszeit wie in kMDItemContentCreationDate magisch zu aktualisieren.

So setzen Sie filename auf eine ctime vom 1. Okt 2010 und eine mtime vom 2. Okt 2010:

%Vor%     
dj. 08.12.2011, 03:16
quelle

4 Antworten

11

Es gibt eine Ruby-Lösung mit der Methode utime . Aber Sie müssen Modifikationszeit (mtime) und Zugriffszeit (atime) auf einmal festlegen. Wenn Sie die Zugriffszeit beibehalten möchten, können Sie Folgendes verwenden:

%Vor%

Siehe Ruby-Core-Dokumentation .

    
iltempo 28.08.2012, 07:03
quelle
3

Sie haben definitiv eine reine Ruby-Lösung, aber da dies OS X ist, sind Sie gegen exec() oder system() und benutzen nur touch ? In deinem Fall würde ich fast bevorzugen:

%Vor%

nur aus Gründen der Klarheit.

    
Nathan Meyer 24.12.2011 19:54
quelle
1

Damit kann ich die Erstellungszeit unter OS X 10.11.1 aktualisieren:

%Vor%

Kein Anspruch auf Portabilität - SetFile ist ein OS X-Befehl (und die man-Seite sagt, dass es mit XCode 6 veraltet ist, also möglicherweise nicht sehr lange funktioniert) - konnte keine andere Möglichkeit finden, es zu tun, Time.utime didn Die Erstellungszeit wird nicht aktualisiert, sondern nur die Zeit geändert und abgerufen.

Siehe: Ссылка

    
Stan Kurdziel 08.02.2016 18:38
quelle
0

Ruby verwendet den Systemaufruf von utimes, um die Dateizeiten zu ändern.

Das Lesen der Man-Page für utimes erklärt, was passiert:

int      utimes (const char * Pfad, const Struktur timeval * mal); .. Wenn Zeiten nicht NULL sind, wird angenommen, dass sie auf ein Array von zwei Zeitwerten zeigen      Strukturen. Die Zugriffszeit wird auf den Wert des ersten Elements gesetzt,      und die Modifikationszeit wird auf den Wert des zweiten Elements eingestellt. Zum      Dateisysteme, die Dateierstellungszeiten (wie UFS2) unterstützen, die      Geburtszeit wird auf den Wert des zweiten Elements gesetzt, wenn der zweite      Element ist älter als die aktuell eingestellte Geburtszeit. Um beide eine Geburt zu setzen      Zeit und eine Modifikationszeit sind zwei Aufrufe erforderlich; der erste zu setzen      die Geburtszeit und die Sekunde, um die (vermutlich neuere) Modifikation einzustellen      Zeit. ...

So ctime wird nur rückwärts in der Zeit aktualisiert.

    
thilo 02.10.2017 10:11
quelle

Tags und Links