Wie kann ich die file creation time ermitteln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

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
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.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

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!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten