2014-05-20 38 views
1

我想寫一個簡單的應用程序,告訴我什麼時候文件已被修改。監控文件的完整性

<QFileSystemWatcher>類只監視程序運行時的更改嗎?

如果是這樣,是否還有其他可用於文件完整性監控的類?

+0

是的,它只會監視程序運行時的狀態,但@LaszloPapp指出,你可以得到一個散列的文件並存儲它們,然後驗證你的程序下次啓動時它們是否發生了變化。或者,創建一個服務(Windows)或守護進程(OSX/Linux),以便始終運行並監視文件。 – TheDarkKnight

回答

1

您可以先使用QProcess運行md5sum等,然後對已更改的信號進行比較。

另一種方法是讀取或mmap中的所有文件並使用QCryptoGraphicHash創建散列。無論採用哪種方式,您都會先執行此操作,然後在信號處理程序中,一旦連接在您的QObject子類中正確創建,也會執行此操作。

#include <QObject> 
#include <QFileSystemWatcher> 

class MyClass : public QObject 
{ 
    Q_OBJECT 
    public: 
     explicit MyClass(QObject *parent = Q_NULLPTR) 
      : QObject(parent) 
     { 
      // ... 
      connect(m_fileSystemWatcher, SIGNAL(fileChanged(const QString&)), SLOT(checkIntegrity(const QString&))); 
      // ... 
     } 

    public slots: 
     void checkIntegrity(const QString &path) 
     { 
      // 1a. Use QProcess with an application like md5sum/sha1sum 
      // OR 
      // 1b. Use QFile with readAll() QCryptoGraphicsHash 
      // 2. Compare with the previous 
      // 3. Set the current to the new 
     } 

    private: 
     QFileSystemWatcher m_fileSystemWatcher; 
}; 

聲明:這顯然不是以任何方式測試,無論如何,但我希望它能證明這個概念。

+0

缺少CheckIntegrity函數的MyClass範圍; O) – TheDarkKnight

+0

@ Merlin069:我通常會爲內聯頭文件編寫示例,因爲如果我編寫cpp,用戶往往會詢問頭文件的問題,因此它更自包含。我打算添加標題類的樣板文件,但我被召集到會議中。 :P現在會這樣做。感謝提醒,它不完整。 :) – lpapp