Seite 1 von 1

Wie kann ich die file creation time ermitteln

Verfasst: Samstag 27. Februar 2010, 15:23
von kbr
Hallo Forum,

ich suche mir gerade einen Wolf. Ich möchte gerne von Dateien in einem Verzeichnis die Zeiten ermitteln, zu denen diese Dateien ursprünglich erzeugt wurden. Die Dateien kommen von FreeBSD und wurden nach Mac OS X kopiert.

Mit os.path.getctime() resp. os.stat() gelange ich stets nur an das Datum der letzten Modifizierung, so wie es auch in der Doku bezüglich UNIX steht. OS X kann aber sowohl im Finder als auch in der Konsole das Erstellungsdatum sehr wohl korrekt anzeigen, d.h. die Informationen sind vorhanden. Nur, wie komme ich dran?

Gruß
kbr

Verfasst: Sonntag 28. Februar 2010, 10:11
von sma
Ich würde sagen, der Finder betrügt dich. Wenn ich eine Datei neu erzeuge, sind "Erstellt" und "Geändert" gleich. Ändere ich eine Minute später die Datei, ist auch das "Erstellt"-Datum anders und beide Daten sind wieder gleich.

So wie ich das verstanden hatte, konnte der Mac vor OS/X man diese beiden Daten unterscheiden, doch mit der Unixifizierung durch OS/X ist das für das n un verwendete Dateisystem unter den Tisch gefallen. Das gibt da im Web lange Diskussionen dazu, ob es solches Datum überhaupt sinnvoll ist, wie man es beim Kopieren von Dateien zu interpretieren hat usw. Wollte ich jetzt nicht alles lesen.

Stefan

Verfasst: Sonntag 28. Februar 2010, 14:30
von Darii
sma hat geschrieben:Ich würde sagen, der Finder betrügt dich. Wenn ich eine Datei neu erzeuge, sind "Erstellt" und "Geändert" gleich. Ändere ich eine Minute später die Datei, ist auch das "Erstellt"-Datum anders und beide Daten sind wieder gleich.
Das ist nicht ganz korrekt. Vielleicht liegt es an deinem Programm, dass die Datei statt sie zu ändern neu anlegt? Bei mir(Textmate) geht es zumindest.

@kbr: Am nimmst du dazu das Cocoa-Framework.

Code: Alles auswählen

from Foundation import NSURL, NSURLCreationDateKey
url = NSURL.fileURLWithPath_("/irgendeine/datei")
success, creation_date, error = url.getResourceValue_forKey_error_(None, NSURLCreationDateKey, None)
creation_date ist dann ein NSDate-Objekt, dass du mit der Methode timeIntervalSince1970 in einen Unix-Zeitstempel umwandeln kannst.

Geht so allerdings glaube ich nur bei Snow Leopard. Dafür brauchst du dann die aktuellste Version von pyobjc(nicht die, die bei Snow Leopard dabei ist), da du die Konstante NSURLCreationDateKey sonst nicht hast.

Alternativ nimmst du einfach den String "NSURLCreationDateKey", statt der Konstanten.

Bei weiteren Fragen: Die Apple-Doku ist klasse.

Verfasst: Sonntag 28. Februar 2010, 15:37
von kbr
sma hat geschrieben:Ich würde sagen, der Finder betrügt dich.
Diese Idee wäre naheliegend. Aber auch wenn ich Dateien ändere, bleibt der Finder bei seiner Aussage und ich bekomme in der Konsole mit ls -l bzw. ls -Ul die korrekten Modifizierungs- bzw. Erstellungszeiten angezeigt; sowohl unter OS X als auch bei FreeBSD.
Darii hat geschrieben:Am nimmst du dazu das Cocoa-Framework
Danke für den konstruktiven Hinweis. Aber ich möchte gerne plattformunabhängig bleiben, da das Script später auch unter FreeBSD laufen soll. Ich habe mir jetzt erstmal durch einen Workaround geholfen, bei dem dieses Datum nicht verwendet wird.

Schade, dass nicht alle Informationen, die per "ls" verfügbar sind, auch mit dem os-Modul abgerufen werden können. Falls es doch eine Lösung gibt, würde dies mich immer noch interessieren.

Danke für die Antworten,
Klaus

Verfasst: Sonntag 28. Februar 2010, 16:22
von lunar
Ich weiß nicht, ob ich Dich richtig verstehe, aber eine "Erstellungszeit" kennt Unix im Allgemeinen nicht, deswegen verträgt sich der Anspruch, diese Zeit auslesen zu wollen, nicht mit dem Anspruch der Plattformunabhängigkeit. Unix kennt nur Zeitstempel für den letzten Zugriff, die letzte Veränderung und die letzte Änderung an den Metadaten, und an diese drei Zeitstempel kommt man auch über "os.stat()" heran. Alles darüber hinausgehende ist plattformabhängig.

Zumindest unter FreeBSD aber gibt es "os.stat(…).st_birthtime", was laut Dokumentation die Zeitpunkt der Erstellung angibt.

Verfasst: Sonntag 28. Februar 2010, 17:52
von kbr
lunar hat geschrieben:Ich weiß nicht, ob ich Dich richtig verstehe, aber eine "Erstellungszeit" kennt Unix im Allgemeinen nicht, deswegen verträgt sich der Anspruch, diese Zeit auslesen zu wollen, nicht mit dem Anspruch der Plattformunabhängigkeit. Unix kennt nur Zeitstempel für den letzten Zugriff, die letzte Veränderung und die letzte Änderung an den Metadaten, und an diese drei Zeitstempel kommt man auch über "os.stat()" heran. Alles darüber hinausgehende ist plattformabhängig.


Ich denke, Du hast mich richtig verstanden und es handelt sich bei dem was ich wollte wohl tatsächlich um eine Information, die plattformunabhängig nicht verfügbar zu sein scheint. Allerdings geben die manpages von OS X und FreeBSD für die Oprtion -U von ls übereinstimmend an, den Zeitpunkt der "file creation" statt "last modification" zu verwenden. Eine "Erstellungszeit" scheinen diese beiden OSs zu kennen und sie scheint auch bei der Übertragung zwischen den beiden Systemen erhalten zu bleiben.
lunar hat geschrieben:Zumindest unter FreeBSD aber gibt es "os.stat(…).st_birthtime", was laut Dokumentation die Zeitpunkt der Erstellung angibt.
Sorry, hatte vergessen zu schreiben, dass ich dies bereits versucht hatte; zumindest auf meiner Installation (7.2) wird dieses Attribut nicht gesetzt (auch nicht, wenn ich das Skript als root laufen lasse). Ohne diskutieren zu wollen, ob es sinnvoll ist, an dieses Datum zu gelangen, scheint es mit Python (2.6) wohl nicht zu gehen.

Gruß
Klaus

Verfasst: Sonntag 28. Februar 2010, 18:29
von Darii
kbr hat geschrieben:Allerdings geben die manpages von OS X und FreeBSD für die Oprtion -U von ls übereinstimmend an, den Zeitpunkt der "file creation" statt "last modification" zu verwenden.
Dann hast du zwei Möglichkeiten, entweder du durchsuchst die Ausgabe von ls nach den Informationen die du suchst oder du guckst wie ls an die Informationen kommt(allerdings wird das vermutlich auch nicht Plattformunabhängig sein). Die Sourcen davon sollten in beiden Fällen verfügbar sein.
Eine "Erstellungszeit" scheinen diese beiden OSs zu kennen und sie scheint auch bei der Übertragung zwischen den beiden Systemen erhalten zu bleiben.
Bliebe zu klären, wie die „Übertragung“ erfolgt. Da nicht einfach die Festplatte direkt im anderes System einbindest findest du da vielleicht eine halbwegs Plattformunabhängige Lösung.

Verfasst: Sonntag 28. Februar 2010, 20:53
von kbr
Ich werde jetzt erst einmal akzeptieren, dass es mit os.stat() etc. nicht geht. Mittels der Analyse der Ausgabe von ls oder plattformspezifischen Lösungen würde es sicherlich hinzubiegen sein, ist aber nicht der Weg, den ich mir gewünscht hätte.

Danke für's mitdenken!

Verfasst: Montag 1. März 2010, 10:17
von sma
Darii hat geschrieben:
sma hat geschrieben:Ich würde sagen, der Finder betrügt dich. Wenn ich eine Datei neu erzeuge, sind "Erstellt" und "Geändert" gleich. Ändere ich eine Minute später die Datei, ist auch das "Erstellt"-Datum anders und beide Daten sind wieder gleich.
Das ist nicht ganz korrekt. Vielleicht liegt es an deinem Programm, dass die Datei statt sie zu ändern neu anlegt? Bei mir(Textmate) geht es zumindest.
Ok, dann hat vim, den ich benutzt hatte, mich betrogen. Sorry.

Stefan

Verfasst: Montag 1. März 2010, 10:57
von Leonidas
sma hat geschrieben:Ok, dann hat vim, den ich benutzt hatte, mich betrogen.
Ich schätze das liegt daran, dass Vim eine neue Datei erstellt, in diese speichert und dann sie über die alte drüberkopiert.