c linux检查文件是否更新/更改/修改?

时间:2012-02-21 11:41:41

标签: c linux file-io

如果文件已更新/更改,如何检查c,linux。

我想在打开文件并从中执行提取/ i / o操作之前检查文件是否有更新。

3 个答案:

答案 0 :(得分:12)

查看stat(2)的{​​{3}}。获取st_mtime结构的struct stat成员,该成员将告诉您文件的修改时间。如果当前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;
}

这是man page,如果这就是你要找的东西。

答案 1 :(得分:8)

你必须使用inotify。

为此,

stat()比无用更糟糕。如果st_mtime与您上次检查时不同,则会告诉您文件已更改,一切正常。

但是如果st_mtime是相同的呢?无法保证这意味着文件未在文件系统时间戳的粒度内更改。例如,在ext3上,粒度往往是几毫秒。您不能依赖于检查之间的时差,重要的是在您的流程最后一次检查后文件可能被更改的速度。

因此,即使st_mtime相同,也无法确定文件是否已更改。因此,您必须假设它具有,并且没有必要通过测试来欺骗自己。

如果您希望在创建和替换操作中将文件(该名称)替换为新文件,则同样的问题也适用于st_ino。可以重复使用inode编号,并且在几次替换之后,文件(按名称)可以再次返回其原始inode编号。

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

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

答案 2 :(得分:5)

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