2012-02-21 115 views
6

如何在c,linux中檢查文件是否已更新/更改。c linux檢查文件是否更新/更改/修改?

我想在打開文件並從中執行提取/ I/O操作之前檢查文件以進行更新。

+0

僅當文件不同才應該處理(更新不一定意味着不同)? – hmjd 2012-02-21 11:52:24

+2

你也可以看看['inotify'](http://linux.die.net/man/7/inotify) – 2012-02-21 12:04:48

+0

可以說它是一個srt/subtitle/captions文件。編號喜歡檢查它是否已更新之前,我從中提取數據。 – 2012-02-21 12:31:15

回答

11

查看man pagestat(2)。獲取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,那麼這是否意味着文件被修改.. ?? – 2012-02-21 11:56:49

+0

感謝您的編輯......你是什麼意思? – Anthony 2012-02-21 12:17:41

+2

@ Mr.32:我想你對這個信息感到困惑。這意味着錯誤發生在'file_is_modified'函數中(如果你看到這個函數的名字)。也許'perror(「[file_is_modified] stat」);'不會讓你有這個疑問 – 2012-02-21 12:29:13

5

規範的方法是通過stat(2)檢查文件的mtime。

+0

你可以發佈代碼嗎? – 2012-02-21 12:32:25

+3

手冊頁中的示例有什麼問題? – 2012-02-21 12:42:34

5

您必須使用inotify。

stat()比這個用途更糟糕。如果st_mtime與上次檢查時不同,那麼這會告訴您文件已更改,並且一切正常。

但是如果st_mtime是一樣的呢?不能保證這意味着文件在文件系統時間戳的粒度範圍內沒有改變。例如,在ext3中,粒度趨向於幾毫秒。你不能依賴你檢查兩者之間的時間差,重要的是你的程序最後一次檢查後文件可能有多快被改變。

所以,即使st_mtime是一樣的,你也不能確定文件還沒有的變化。因此你必須假設它已經存在了,而且通過測試來欺騙你自己也沒有意義。

如果您希望在創建和替換操作中將文件(該名稱)替換爲新文件,則st_ino也會出現相同的問題。 inode號碼可以被重新使用,並且在幾次替換之後,文件(通過名稱)可以再次返回到其原始inode號碼。

同樣的問題適用於文件大小,甚至創建文件的散列。所有允許您確定的是該文件已更改。這些方法都不能讓你完全確信它已經改變了,甚至散列(儘管這接近了置信度)還沒有

不要浪費你的時間stat(),這是一個傻瓜的差事。