ctime总是< = mtime?

时间:2011-01-03 06:36:34

标签: python linux unix filesystems

在Python中使用os.stat()时,我可以假设st_ctime总是小于或等于st_mtime吗?如果没有,为什么不呢?

代码将始终在Linux上运行,但如果操作系统之间存在差异,那么最好知道。

5 个答案:

答案 0 :(得分:4)

完全有可能以编程方式设置这两个值。您也可以通过在创建文件之前将时钟设置回来“自然地”实现此目的。

换句话说,是的。这很不寻常,但完全有可能。

答案 1 :(得分:4)

在某些情况下,这种假设可能无效(并且在很大程度上取决于操作系统的实施):

  • 时区。如果您创建一个文件,比如UTC + 4,然后在当前时区为UTC-8时修改它,并且操作系统不对后台的所有时间戳使用UTC,则修改时间将会减少比创造的时间。对于现代操作系统(Windows,OSX,其中一个BSD或Linux)而言,mtime<在这种情况下是ctime。
  • 重置操作系统时间。这可能会影响创建此情况的修改时间。我会说你很可能会有mtime<假设在文件系统驱动程序中没有检查以避免这种情况,ctime在这种情况下没有来自操作系统的投诉。
  • 通过系统调用修改时间。同样,文件系统驱动程序可能会进行检查以避免出现异常情况,例如:

这些都是可重复的:您最好的选择是采用您计划定位和测试此行为的各种操作系统。我所能提供的只是推测。

,st_ctime不一定是“创建时间”,而是“上次状态更改”的时间(source)。 utime标记要更新的文件的ctimesource),其类型为“utimbuf”的参数没有ctime的成员。因此,如果操作系统和文件系统允许,ctime在技术上可能是超过mtime的时间。 os.stat文档实际上提到了这一点:

  

平台依赖;时间最多   Unix上最近的元数据更改,或者   在Windows上创建的时间

虽然Python隐藏了很多C方面的东西,os.stat和朋友们都建立在相同的基本C系统调用之上,所以它们的规范是寻找更多信息的好地方。

答案 2 :(得分:4)

请定义“小于”,您的意思是更新还是更老?您不能假设ctime在mtime之前发生,但通常ctime与mtime相同或之后。

unix上的ctime不是“创建时间”,而是“更改时间”。更改文件内容时更新mtime,但更改文件元数据时更新ctime(这意味着更新mtime时也会更新),因此ctime在mtime之后是完全正常的。这是一个例子:

user@ubuntu:~$ touch test
user@ubuntu:~$ chmod 600 test
user@ubuntu:~$ stat test
  File: «test»
  Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: 700h/1792d Inode: 222375      Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-01-03 12:35:15.945973569 +0100
Modify: 2011-01-03 12:35:15.945973569 +0100
Change: 2011-01-03 12:35:24.024998291 +0100

另外,我相信在Windows上,ctime字段实际上意味着“创建时间”,这是Windows和Unix之间的操作系统差异。我在网上看过这个,但我会让你自己研究这个。

答案 3 :(得分:3)

你的方法错了!在Linux(或Mac或任何其他Unix系统)上,ctime通常总是比mtime更早,而不是更早。与Windows不同,其中ctime是文件创建日期,mtime是文件修改日期,在Unix中它们两个修改日期,区别在于:

    只要内容文件发生变化,
  • mtime就会更新 只要文件属性发生变化,
  • ctime就会更新,包括mtime

stat utility的(至少某些变体)的手册页分别指的是“上次数据修改的时间”“上次状态更改的时间“

因此,每当mtime更新时,ctime也会更新。我所知道的唯一可以获得大于mtime的{​​{1}}的机制是:

由于您在Python的上下文中提到过,让我们创建一个简单的Python工具,输出给定文件的mtimemtime来帮助我们演示这一点。我们会在脚本中使用方便的os.path.getctimeos.path.getctime API,但使用stat调用结果的ctimest_ctime属性会给出完全相同的结果:

st_mtime

我们可以将其保存为#!/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)) ,使其可执行,并在我们的Unix shell中进行实验:

pystat.py

答案 4 :(得分:0)

正如@ketil所说,当文件元数据发生变化时,ctime会更新。

这可以改变的一种方法是将文件从一个目录移动到另一个目录。 ctime会改变,但不会改变。

touch test_file
mv test_file another_directory/
stat another_directory/test_file 

给出

  File: `another_directory/test_file'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 80ah/2058d  Inode: 23183108    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1004/  agrimm)   Gid: ( 1004/  agrimm)
Access: 2011-07-07 10:11:27.000000000 +1000
Modify: 2011-07-07 10:11:27.000000000 +1000
Change: 2011-07-07 10:11:43.000000000 +1000