2012-02-21 90 views
6

如何在c,linux中检查文件是否已更新/更改。c linux检查文件是否更新/更改/修改?

我想在打开文件并从中执行提取/ I/O操作之前检查文件以进行更新。

+0

仅当文件不同才应该处理(更新不一定意味着不同)? – hmjd 2012-02-21 11:52:24

+2

你也可以看看['inotify'](http://linux.die.net/man/7/inotify) – 2012-02-21 12:04:48

+0

可以说它是一个srt/subtitle/captions文件。编号喜欢检查它是否已更新之前,我从中提取数据。 – 2012-02-21 12:31:15

回答

11

查看man pagestat(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,如果这就是你要找的内容。

+0

如果stat失败并且不返回0,那么这是否意味着文件被修改.. ?? – 2012-02-21 11:56:49

+0

感谢您的编辑......你是什么意思? – Anthony 2012-02-21 12:17:41

+2

@ Mr.32:我想你对这个信息感到困惑。这意味着错误发生在'file_is_modified'函数中(如果你看到这个函数的名字)。也许'perror(“[file_is_modified] stat”);'不会让你有这个疑问 – 2012-02-21 12:29:13

5

规范的方法是通过stat(2)检查文件的mtime。

+0

你可以发布代码吗? – 2012-02-21 12:32:25

+3

手册页中的示例有什么问题? – 2012-02-21 12:42:34

5

您必须使用inotify。

stat()比这个用途更糟糕。如果st_mtime与上次检查时不同,那么这会告诉您文件已更改,并且一切正常。

但是如果st_mtime是一样的呢?不能保证这意味着文件在文件系统时间戳的粒度范围内没有改变。例如,在ext3中,粒度趋向于几毫秒。你不能依赖你检查两者之间的时间差,重要的是你的程序最后一次检查后文件可能有多快被改变。

所以,即使st_mtime是一样的,你也不能确定文件还没有的变化。因此你必须假设它已经存在了,而且通过测试来欺骗你自己也没有意义。

如果您希望在创建和替换操作中将文件(该名称)替换为新文件,则st_ino也会出现相同的问题。 inode号码可以被重新使用,并且在几次替换之后,文件(通过名称)可以再次返回到其原始inode号码。

同样的问题适用于文件大小,甚至创建文件的散列。所有允许您确定的是该文件已更改。这些方法都不能让你完全确信它已经改变了,甚至散列(尽管这接近了置信度)还没有

不要浪费你的时间stat(),这是一个傻瓜的差事。