2011-04-10 65 views
3

我正在用C语言编写一个用于linux的程序,该程序在一段时间内每隔x秒扫描一次目录以进行修改,但我无法找到何时创建文件或目录。以下是我考虑的一些选项:使用C,我怎样知道文件何时被创建?

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

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

  • 保持文件/目录数量的计数。 Similliar问题到最后的想法。

这样说,有没有人有任何想法如何我可以唯一标识创建一个文件/目录?

+0

这取决于你的编码环境。现代操作系统通常实现一种监视目录变化的方式。 – 2011-04-10 21:48:55

+0

不要重新发明轮子,使用操作系统特定的机制。 – crazyscot 2011-04-10 21:54:49

回答

4

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

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

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

编辑:

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

+0

inotify是伟大的。尽管如此,你还是会有一些特殊的情况来照顾。试着看一个目录,听所有事件,打开例如gedit,写一些东西并保存到你正在观看的目录中。有趣的东西肯定会发生。 – manneorama 2011-04-11 10:28:03

+1

@manneorama:inotify最糟糕的问题是缺乏递归手表。用户空间应用程序必须设置递归手表本身... – thkala 2011-04-11 12:12:35

相关问题