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

Adi*_*a P 10 c linux file-io

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

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

Ant*_*ony 12

看看手册页stat(2).获取结构的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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个介绍inotify,如果这是你正在寻找的.

  • @ Mr.32:我觉得你对这个消息感到困惑.这意味着错误发生在`file_is_modified`函数中(如果你看到,那就是函数的名称).也许`perror("[file_is_modified] stat");`不会让你有这个疑问 (2认同)

Rog*_*org 8

你必须使用inotify.

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

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

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

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

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

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


Ign*_*ams 5

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

  • 手册页中的示例有什么问题? (3认同)