2012-02-21 19 views
6

ファイルが更新/変更された場合、c、linuxをチェックインする方法。c linuxファイルが更新/変更/変更されているかどうかを確認しますか?

ファイルを開いてファイルを開いてから抽出/ i/o操作を実行する前に、ファイルの更新を確認したいと考えています。

+0

ファイルが処理されるべきである(更新が必ずしも異なるとは限りません)ファイルが異なる場合のみですか? – hmjd

+2

あなたは['inotify'](http://linux.die.net/man/7/inotify) –

+0

を見て、そのsrt/subtitle/captionファイルを言うこともできます。私はそれからデータを抽出する前に、そのIDが更新されているかどうかチェックしたい。 –

答えて

11

stat(2)man pageをご覧ください。 struct stat構造体のst_mtimeメンバーを取得します。これにより、ファイルの変更時刻がわかります。現在のmtimeが前のmtimeより後である場合、ファイルは変更されています。

例:

int file_is_modified(const char *path, time_t oldMTime) { 
    struct stat file_stat; 
    int err = stat(path, &file_stat); 
    if (err != 0) { 
     perror(" [file_is_modified] stat"); 
     exit(errno); 
    } 
    return file_stat.st_mtime > oldMTime; 
} 

それはあなたが探しているものだならばここで、an introduction to inotifyです。

+0

statが失敗して0を返していない場合、ファイルが変更されたことを意味しますか? –

+0

編集していただきありがとうございます...どういう意味ですか? – Anthony

+2

@ Mr.32:あなたはメッセージと混同していると思います。つまり、 'file_is_modified'関数でエラーが発生したことを意味します(それが見えれば関数の名前です)。たぶん 'perror(" [file_is_modified] stat ");'あなたがこの疑念を持っていなかったのですが、 –

5

正規の方法は、ファイルのmtimeをstat(2)で確認することです。

+0

コードビットを投稿できますか? –

+3

マニュアルページの例で何が問題になっていますか? –

5

あなたはinotifyを使用する必要があります。

stat()はこの目的では役に立たないものです。 st_mtimeが最後にチェックした時と異なる場合、これはファイルが変更されたことを示し、すべて正常です。

しかし、st_mtimeが同じ場合はどうなりますか?これは、ファイルシステムのタイムスタンプの粒度内でファイルが変更されていないことを意味するものではありません。たとえばext3では、細かさは複数ミリ秒になる傾向があります。あなたのチェックの時間差に頼ることはできません。重要なのは、プロセスが最後にチェックした後にファイルがどれくらい速く変更されたかということです。

st_mtimeが同じでも、ファイルが変更されていないことを確認できません。したがって、あなたはそれがあると仮定しなければなりません、そして、テストを行うことによってあなたを欺くことには何の意味もありません。

同じ名前のファイルを作成および置換操作で新しいファイルに置き換えることを想定している場合は、同じ問題がst_inoに適用されます。 inode番号を再利用することができます。また、いくつかの置換の後、ファイル(名前で)を元のinode番号に戻すことができます。

同じ問題がファイルサイズに適用されるか、ファイルのハッシュを作成することさえあります。あなたが判断できるのは、ファイルが変更されたことだけです。これらの方法のどれも、に変更されていないことを完全に確信させることはできません。

stat()で時間を無駄にしないでください、それは愚かなことです。