如果文件已更新/更改,如何检查c,linux。
我想在打开文件并从中执行提取/ i / o操作之前检查文件是否有更新。
答案 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。