C语言中如何检查文件是否被更新/改变/修改?

10

如何在 c、Linux 中检查文件是否已更新/更改。

我想在打开文件和从中执行提取/ I/O 操作之前检查文件是否已更新。


只有文件不同才需要处理它(更新并不一定意味着不同),是这样吗? - hmjd
2
你也可以查看inotify - another.anon.coward
假设这是一个SRT /字幕/字幕文件。在从中提取数据之前,我想检查它是否已更新。 - Aditya P
3个回答

13

查看 stat(2) 的 man 手册。获取 struct stat 结构体的 st_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;
}

如果您正在寻找的是 inotify 的介绍,这里有一篇文章可供参考。


如果if语句执行失败并且没有返回0,那么这是否意味着文件已被修改..? - Jeegar Patel
2
@Mr.32:我认为您对该消息感到困惑。它的意思是错误发生在“file_is_modified”函数中(如果您看到的话,这就是该函数的名称)。也许“perror(“[file_is_modified] stat”);”不会让您产生这种疑惑。 - another.anon.coward
@another.anon.coward 是的,你说得对,现在我的疑惑也消除了 :) 谢谢 - Jeegar Patel
@AdityaGameProgrammer 是的,不过如果你查看另一个匿名者的建议 inotify,那么你就可以监控文件系统操作。不过这个方法会稍微复杂一些。 - Anthony
是的,如果你愿意处理跟踪它们的开销的话。另一个优点是你可以将它们持久化,这样你就不必让一个进程一直运行。 - Anthony
显示剩余3条评论

10
你需要使用inotify。
stat() 对于这个目的来说是没有用的,如果st_mtime与上次检查时不同,则说明文件已经改变,一切正常。
但是如果st_mtime相同呢?不能保证这意味着文件在文件系统时间戳粒度内没有更改。例如,在ext3上,时间粒度往往是以多毫秒为单位的。你也不能依赖于检查时的时间差异,重要的是该进程上次检查后文件可能已经被改变了多快。
因此,即使st_mtime相同,你也不能确定文件没有被改变过。因此,你必须假设它已经被改变了,而通过测试是没有意义的。
对于st_ino也存在同样的问题,如果你期望文件(该名称)被创建和替换操作替换为一个新文件。inode号码可以被重新使用,经过几次替换后,一个文件(按名称)可以回到其原始的inode号码。
文件大小或甚至创建文件的哈希值也存在同样的问题。所有这些方法只能让你确定文件是否已经发生了更改。没有任何一个方法能够完全确信地告诉你它没有被改变过,即使是哈希(虽然这种方法接近于信任)。
不要浪费时间使用stat(),这是愚蠢的行为。

6

规范的方法是通过stat(2)检查文件的修改时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接