Используя C, как я могу узнать, когда создается файл? - PullRequest
3 голосов
/ 11 апреля 2011

Я делаю программу на C для Linux, которая сканирует каталог каждые x секунд в течение периода времени для изменений, но у меня возникают проблемы с поиском, когда создается файл или каталог. Вот несколько вариантов, которые я рассмотрел:

  • Используя структуру stat, проверьте, совпадают ли время последнего изменения состояния и времени изменения данных. Это поднимает проблему, заключающуюся в том, что вы можете создать файл, изменить его до того, как программа сможет проверить его, который изменяет метку времени изменения данных и больше не видит его как новый файл.

  • Вести журнал имени каждого файла / каталога в каталоге и проверять наличие новых. Проблема заключается в том, что вы удаляете файл, а затем создаете новый с тем же именем, он не интерпретируется как новый файл.

  • Вести подсчет количества файлов / каталогов. Схожая задача до последней идеи.

С учетом сказанного, кто-нибудь имеет представление о том, как я могу однозначно идентифицировать создание файла / каталога?

Ответы [ 3 ]

4 голосов
/ 11 апреля 2011

Вы не можете, по крайней мере, так. В POSIX нет условий для хранения времени создания в файловой системе, как это делают Windows и некоторые другие ОС. Он сохраняет только время изменения статуса, доступа и модификации. Большинство файловых систем Unix также не хранят эту информацию.

Одной из причин этого является наличие жестких ссылок, поскольку временные метки файлов хранятся в их inode, а не в ссылках на каталог. Что бы вы посчитали временем создания для файла, который был создан в 10:00 и затем жестко связан с другим каталогом в 11:00? Что если файл скопирован?

Ваш лучший, но, к сожалению, специфичный для ОС подход заключается в использовании любой инфраструктуры, доступной в вашей платформе, для мониторинга событий файловой системы, например, inotify в Linux и kqueue в FreeBSD и MacOS X ...

EDIT:

Кстати, Ext4fs в Linux хранит inode время создания (crtime). К сожалению, получение этой информации из пользовательского пространства все еще немного затруднительно неловко .

1 голос
/ 11 апреля 2011

Проверить inotify (для Linux)

1 голос
/ 11 апреля 2011

Возможно, вам следует использовать inotify ?

...