【问题标题】:c linux check if file is updated/changed/modified?c linux检查文件是否更新/更改/修改?
【发布时间】:2012-02-21 11:41:40
【问题描述】:

如果文件已被更新/更改,如何在 c、linux 中签入。

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

【问题讨论】:

  • 是否只有文件不同才应该处理(更新不一定意味着不同)?
  • 你也可以看看inotify
  • 可以说它是一个 srt/subtitle/captions 文件。我想在我从中提取数据之前检查它是否已更新。

标签: c linux file-io


【解决方案1】:

查看man page 对应的stat(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,如果您正在寻找的话。

【讨论】:

  • 如果 stat 失败并且不返回 0 那么是否意味着文件被修改..??
  • @Mr.32:我认为你对这条消息感到困惑。这意味着file_is_modified 函数中发生了错误(如果您看到,那是函数的名称)。也许perror(" [file_is_modified] stat"); 不会让你有这个疑问
  • @another.anon.coward 是的,你是对的,现在我的疑问也很清楚了 :) 谢谢
  • 所以基本上我必须在开始时跟踪文件的时间?
  • @AdityaGameProgrammer 是的,不过如果您查看 another.anon.coward 对inotify 的建议,则意味着您可以监控文件系统操作。不过它有点复杂。
【解决方案2】:

你必须使用 inotify。

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

但是如果 st_mtime 相同呢?不能保证这意味着文件没有在文件系统时间戳的粒度范围内更改。例如,在 ext3 上,粒度往往以多毫秒为单位。您也不能依赖检查之间的时间差,重要的是在您的进程最后一次检查文件后文件的更改速度有多快。

因此,即使 st_mtime 相同,您也无法确定文件没有发生变化。因此,您必须假设它有,并且通过测试来欺骗自己是没有意义的。

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

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

不要在 stat() 上浪费时间,这是徒劳的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多