3

変更のためにx秒ごとにディレクトリをスキャンするLinux用のCでプログラムを作成していますが、ファイルまたはディレクトリがいつ作成されたかを見つけるのに苦労しています。ここに私が検討したいくつかのオプションがあります:

  • stat 構造体を使用して、最後のステータス変更とデータ変更のタイムスタンプが同じかどうかを確認します。これにより、ファイルを作成し、プログラムがチェックする機会を得る前にファイルを変更できるという問題が発生します。これにより、データ変更のタイムスタンプが変更され、新しいファイルとして認識されなくなります。

  • ディレクトリ内のすべてのファイル/ディレクトリの名前のログを保持し、新しいファイルを確認します。これには、ファイルを削除してから同じ名前で新しいファイルを作成するという問題があり、新しいファイルとして解釈されません。

  • ファイル/ディレクトリの数を数えます。最後のアイデアと同様の問題。

そうは言っても、ファイル/ディレクトリの作成を一意に識別する方法について誰かが知っていますか?

4

3 に答える 3

4

少なくともこの方法ではできません。POSIX には、Windows や他の一部の OS のように、ファイルの作成時刻をファイル システムに格納するための規定がありません。ステータスの変更、アクセス、および変更時間のみが保持されます。ほとんどの Unix ファイルシステムもその情報を保存しません。

この理由の 1 つは、ハード リンクの存在です。ファイルのタイムスタンプはディレクトリ参照ではなく inode に格納されるためです。午前 10 時に作成され、午前 11 時に別のディレクトリにハード リンクされたファイルの作成時間はどれくらいだと思いますか? ファイルがコピーされた場合はどうなりますか?

残念ながらOS固有の最善のアプローチは、プラットフォームで利用可能なフレームワークを使用してファイルシステムイベントを監視することです。たとえば、Linuxではinotify、FreeBSDおよびMacOS Xではkqueue ...

編集:

ところで、Linux の Ext4fs はinode作成時刻を保存します ( crtime)。残念ながら、ユーザー空間からその情報を取得することは、少なくとも少し厄介です

于 2011-04-10T21:49:15.490 に答える
1

おそらくinotifyを使用する必要がありますか?

于 2011-04-10T21:48:55.170 に答える
1

チェックアウトinotify(Linux 固有)。

于 2011-04-10T21:49:18.540 に答える