使用C语言,如何知道文件何时被创建?

3
我正在为Linux编写一个C程序,每隔 x 秒扫描一个目录以查找修改,但我无法找到文件或文件夹被创建的时间。以下是我考虑过的几个选项:
1. 使用 stat 结构体,检查最后状态更改和数据修改时间戳是否相同。这带来的问题是,您可以创建文件,在程序有机会检查它之前进行修改,这会更改数据修改时间戳,并且不再将其视为新文件。
2. 记录目录中每个文件/目录的名称并检查新文件。这样做会出现这样的问题:您删除一个文件然后创建一个具有相同名称的新文件,它不会被解释为新文件。
3. 记录文件/目录的数量。与上一个想法类似的问题。
基于以上情况,有人有什么关于如何唯一标识文件/文件夹的创建的想法吗?

这取决于你的编程环境。现代操作系统通常实现了一种监视目录更改的方式。 - Georg Schölly
不要重复造轮子,使用特定于操作系统的机制。 - crazyscot
3个回答

4
你至少不能以这种方式实现。 POSIX没有提供在文件系统中存储文件创建时间的规定,像Windows和其他一些操作系统那样。它只保留状态更改、访问和修改时间。大多数Unix文件系统也不存储该信息。
其中一个原因是硬链接的存在,因为文件时间戳存储在它们的i节点中而不是目录引用中。如果一个文件在上午10点创建,然后在上午11点被硬链接到另一个目录中,你会认为创建时间是什么?如果文件被复制呢?
你最好的方法是使用平台上可用的任何框架来监视文件系统事件,例如Linux上的inotify,FreeBSD和MacOS X上的kqueue...
编辑:
顺便说一下,Linux上的Ext4fs确实存储i-node创建时间(crtime)。不幸的是,从用户空间获取该信息仍然至少有一些困难

inotify非常好。但是你需要注意一些特殊情况。尝试监视一个目录,监听所有事件,例如打开gedit,写一些东西并将其保存到你正在观察的目录中。有趣的事情一定会发生。 - manneorama
1
@manneorama:inotify 最糟糕的问题是缺乏递归监视。用户空间应用程序必须自己设置递归监视... - thkala

1

1

查看inotify(仅适用于Linux)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接