Masz to w niewłaściwy sposób okrągłe! W systemie Linux (lub Mac, lub w dowolnym innym systemie uniksowym), ctime
będzie zwykle zawsze PÓŹNIEJSZY niż mtime
, nie wcześniej. W przeciwieństwie do Windows, gdzie ctime
jest data utworzenia pliku i mtime
jest data modyfikacji pliku w systemie Unix oni oba daty modyfikacji, z tą różnicą, że:
mtime
zostanie zaktualizowany, gdy plik zawartość zmienia
ctime
zostanie zaktualizowany, gdy plik atrybuty zmiany, łącznie z jego mtime
Strona podręcznika dla (przynajmniej niektórych wariantów) stat
utility odnosi się do nich odpowiednio jako "Czas ostatniej modyfikacji danych" i "Czas ostatniej zmiany statusu".
Tak więc zawsze, gdy mtime
zostanie zaktualizowany, ctime
również zostanie zaktualizowany. Jedynymi mechanizmy znam, w którym można zawsze uzyskać mtime
, która jest większa niż ctime
są:
- ręcznego ustawiania
mtime
być w przyszłości za pomocą utime
or utimes
system calls lub narzędzie, które wykorzystuje je jak touch -d
- zapisu na dysku w sposób, który omija API systemu plików Linux, czy rzeczywiście omija system plików w ogóle, jak:
Skoro już zadawane w kontekście Pythonie, zróbmy proste narzędzie Pythona, który wyprowadza mtime
i ctime
danego pliku, aby pomóc nam to zademonstrować.Będziemy korzystać z dogodnych os.path.getctime
i os.path.getctime
API w skrypcie, ale stosując st_ctime
i st_mtime
właściwości wyniku stat
rozmowy dałby dokładnie takie same wyniki:
#!/usr/bin/python
import os
import sys
target_filename = sys.argv[1]
mtime = os.path.getmtime(target_filename)
ctime = os.path.getctime(target_filename)
print('mtime: %f ctime: %f' % (mtime, ctime))
możemy zaoszczędzić że pystat.py
, zrobić jest to plik wykonywalny i eksperyment w naszej powłoce Uniksa:
$ # Times are initially equal:
$ touch foo
$ ./pystat.py foo
mtime: 1473979539.786961 ctime: 1473979539.786961
$
$ # It doesn't matter how I create the file:
$ echo qwerty > bar
$ ./pystat.py bar
mtime: 1473979561.218961 ctime: 1473979561.218961
$
$ # 'touch'ing a created file updates both times:
$ touch foo
$ ./pystat.py foo
mtime: 1473979584.642960 ctime: 1473979584.642960
$
$ touch bar
$ ./pystat.py bar
mtime: 1473979592.762960 ctime: 1473979592.762960
$
$ # Modifying an existing file updates both times:
$ echo stuff >> foo
$ ./pystat.py foo
mtime: 1473979622.722959 ctime: 1473979622.722959
$
$ # Changing permissions ONLY updates the ctime:
$ chmod 777 foo
$ ./pystat.py foo
mtime: 1473979622.722959 ctime: 1473979643.542958
$
$ # So does moving a file:
$ mv bar baz
$ ./pystat.py baz
mtime: 1473979592.762960 ctime: 1473979659.586958
$
$ # Consequently, both files now have ctime > mtime
$
$ # However, we CAN manually set mtime in the future
$ # and thereby cause ctime < mtime:
$ touch --date="2041-01-01 12:34:56" foo
$ ./pystat.py foo
mtime: 2240656496.000000 ctime: 1473989678.258937
To pytanie było nieco zagmatwane, a jego zaakceptowana odpowiedź jest naprawdę zła. Zwykle 'mtime <= ctime', a nie na odwrót! Zobacz [moja odpowiedź] (http://stackoverflow.com/a/39521489/1709587) dla wyjaśnienia i demonstracji tego w powłoce. –
'ctime' to wcale nie jest tworzenie, to metadane ** zmieniają ** czas. Przyjęta odpowiedź jest zatem całkowicie i całkowicie błędna: nie chodzi tylko o "pewne sytuacje" lub (inaczej, jak to to oznacza) rzadkich przypadków narożnych, w których to założenie jest nieważne! –