【问题标题】:Using C, how can I know when a file is created?使用 C,我如何知道文件何时创建?
【发布时间】:2011-04-10 21:44:50
【问题描述】:

我正在用 C 语言为 linux 编写一个程序,该程序在一段时间内每 x 秒扫描一次目录以进行修改,但我无法确定何时创建文件或目录。以下是我考虑的几个选项:

  • 使用 stat 结构体,检查上次状态变化和数据修改时间戳是否相同。这带来了一个问题,您可以创建一个文件,在程序有机会检查它之前对其进行修改,这会更改数据修改时间戳并且不再将其视为新文件。

  • 记录目录中每个文件/目录的名称并检查新的。这有一个问题,您删除一个文件,然后创建一个具有相同名称的新文件,它不会被解释为一个新文件。

  • 记录文件/目录的数量。与上一个想法类似的问题。

话虽如此,有人知道我如何唯一地识别文件/目录的创建吗?

【问题讨论】:

  • 这取决于您的编码环境。现代操作系统通常会实现一种方法来监视目录的更改。
  • 不要重新发明轮子,使用特定于操作系统的机制。

标签: c file posix stat dirent.h


【解决方案1】:

你不能,至少不能这样。 POSIX 没有规定在文件系统中存储文件创建时间,就像 Windows 和其他一些操作系统那样。它只保留状态更改、访问和修改时间。大多数 Unix 文件系统也不存储这些信息。

其中一个原因是硬链接的存在,因为文件时间戳存储在它们的 inode 中,而不是目录引用中。对于在上午 10 点创建然后在上午 11 点硬链接到另一个目录的文件,您认为创建时间是多少?如果复制文件怎么办?

您最好但不幸的是特定于操作系统的方法是使用您平台中可用的任何框架来监视文件系统事件,例如inotify on Linux 和 FreeBSD 和 MacOS X 上的 kqueue...

编辑:

顺便说一下,Linux 上的 Ext4fs 确实存储了 inode 创建时间 (crtime)。不幸的是,从用户空间获取这些信息仍然至少有点awkward

【讨论】:

  • inotify 很棒。不过,您将有一些特殊情况需要处理。尝试查看一个目录,监听所有事件,例如打开 gedit,写一些东西并将其保存到您正在查看的目录中。有趣的事情一定会发生。
  • @manneorama:inotify 最糟糕的问题是缺少递归监视。用户空间应用程序必须自己设置递归监视......
【解决方案2】:

也许你应该使用inotify

【讨论】:

    【解决方案3】:

    查看inotify(Linux 专用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2014-02-07
      • 2011-10-16
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多