c linux检查文件是否更新/更改/修改?
查看man page的stat(2)
。获取struct stat
结构的st_mtime
成员,它将告诉您文件的修改时间。如果当前mtime比之前的mtime晚,则文件已被修改。
一个例子:
int file_is_modified(const char *path, time_t oldMTime) {
struct stat file_stat;
int err = stat(path, &file_stat);
if (err != 0) {
perror(" [file_is_modified] stat");
exit(errno);
}
return file_stat.st_mtime > oldMTime;
}
这里的an introduction to inotify
,如果这就是你要找的内容。
如果stat失败并且不返回0,那么这是否意味着文件被修改.. ?? – 2012-02-21 11:56:49
感谢您的编辑......你是什么意思? – Anthony 2012-02-21 12:17:41
@ Mr.32:我想你对这个信息感到困惑。这意味着错误发生在'file_is_modified'函数中(如果你看到这个函数的名字)。也许'perror(“[file_is_modified] stat”);'不会让你有这个疑问 – 2012-02-21 12:29:13
规范的方法是通过stat(2)
检查文件的mtime。
你可以发布代码吗? – 2012-02-21 12:32:25
手册页中的示例有什么问题? – 2012-02-21 12:42:34
您必须使用inotify。
stat()比这个用途更糟糕。如果st_mtime与上次检查时不同,那么这会告诉您文件已更改,并且一切正常。
但是如果st_mtime是一样的呢?不能保证这意味着文件在文件系统时间戳的粒度范围内没有改变。例如,在ext3中,粒度趋向于几毫秒。你不能依赖你检查两者之间的时间差,重要的是你的程序最后一次检查后文件可能有多快被改变。
所以,即使st_mtime是一样的,你也不能确定文件还没有的变化。因此你必须假设它已经存在了,而且通过测试来欺骗你自己也没有意义。
如果您希望在创建和替换操作中将文件(该名称)替换为新文件,则st_ino也会出现相同的问题。 inode号码可以被重新使用,并且在几次替换之后,文件(通过名称)可以再次返回到其原始inode号码。
同样的问题适用于文件大小,甚至创建文件的散列。所有允许您确定的是该文件已更改。这些方法都不能让你完全确信它已经改变了,甚至散列(尽管这接近了置信度)还没有。
不要浪费你的时间stat(),这是一个傻瓜的差事。
仅当文件不同才应该处理(更新不一定意味着不同)? – hmjd 2012-02-21 11:52:24
你也可以看看['inotify'](http://linux.die.net/man/7/inotify) – 2012-02-21 12:04:48
可以说它是一个srt/subtitle/captions文件。编号喜欢检查它是否已更新之前,我从中提取数据。 – 2012-02-21 12:31:15