2012-09-19 29 views
5

Czy system Windows oferuje coś w rodzaju pola st_ctime POSIX stat, które podaje znacznik czasu ostatniej zmiany metadanych?Windows i ctime/st_ctime

Tło: Mam kilka plików danych, które chciałbym sprawdzić, czy zostały zmodyfikowane od określonego znacznika czasu. Sprawdzanie zmodyfikowanego znacznika czasowego (mtime) jest łatwe i zajmuje się "normalnymi" modyfikacjami, ale jeśli użytkownik kopiuje starsze wersje plików danych, zmodyfikowany znacznik czasu pokaże, że są starsze. W systemie POSIX kopiowanie na starszy plik powodowałoby, że ctime jest nowsze, nawet jeśli mtime jest starsze.

Odpowiedz

2

O ile mogę stwierdzić, Windows powoduje, że dostarcza pole "ostatniej zmiany", ale nie znalazłem żadnego interfejsu Win32 API do uzyskania dostępu do niego, więc musisz użyć Native API.

W szczególności: (I faktycznie nie próbowałem).

Korzystanie z Native API nie jest proste. This question and answer opisz, jak to zrobić.

Cygwin korzysta z tego, aby zapewnić semantykę POSIX pod Windows, jak to omówiono on their mailing list. Otrzymuję informacje od their implementation.

I choć jest to tylko styczność styczna, this article ma dobry opis "utworzonego" znacznika czasu, który system Windows prezentuje (i niestety odnosi się do niego jako ctime). Utworzony znacznik czasu może być nowszy niż zmodyfikowany znacznik czasu, jeśli plik jest kopiowany do nowej lokalizacji (ponieważ utworzono wtedy odwołuje się do czasu utworzenia kopii, podczas gdy modyfikacja odnosi się do daty ostatniej modyfikacji oryginału), ale w przeciwnym razie nie jest aktualizowana, gdy metadane zostały zmienione.

+1

Dzięki, tak, właśnie to @piscisaureus skończyło robić w libuv. ctime jest teraz zaimplementowane z semantyką Unix (aka, "poprawnie") w libuv: https://github.com/joyent/libuv/commit/20a8e58adb2a3fc2e92ceb6e1ceb6f05d7e0d439 Mimo że ta odpowiedź nadeszła po tym, jak już ją znaleźliśmy, nagrodzono nagrodę ponieważ pomogłeś przyszłym użytkownikom znaleźć właściwą odpowiedź :) – isaacs