在Python中使用os.stat()时,我可以假设st_ctime总是小于或等于st_mtime吗?如果没有,为什么不呢?
代码将始终在Linux上运行,但如果操作系统之间存在差异,那么最好知道。
答案 0 :(得分:4)
完全有可能以编程方式设置这两个值。您也可以通过在创建文件之前将时钟设置回来“自然地”实现此目的。
换句话说,是的。这很不寻常,但完全有可能。
答案 1 :(得分:4)
在某些情况下,这种假设可能无效(并且在很大程度上取决于操作系统的实施):
这些都是可重复的:您最好的选择是采用您计划定位和测试此行为的各种操作系统。我所能提供的只是推测。
,st_ctime不一定是“创建时间”,而是“上次状态更改”的时间(source)。 utime
标记要更新的文件的ctime
(source),其类型为“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}}的机制是:
utime
or utimes
system calls或使用touch -d
ctime
由于您在Python的上下文中提到过,让我们创建一个简单的Python工具,输出给定文件的mtime
和mtime
来帮助我们演示这一点。我们会在脚本中使用方便的os.path.getctime
和os.path.getctime
API,但使用stat
调用结果的ctime
和st_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