2

ディレクトリの内容 (深いサブディレクトリ構造を含む) が最後のアクセス以降に変更されたかどうかを判断する手段はありますか? C/C++、できれば Qt で移植可能なソリューションを探しています。

PS: 関連する場合は、質問の背景。私のアプリケーションでは、いくつかの条件が真の場合、多くのディレクトリを再帰的にスキャンし、データベースにデータをインポートする必要があります。ディレクトリがインポートされたら、ファイル「.imported」でマークし、次回は無視します。

ここで、スキャンされたがインポートされていないディレクトリもマークしたいと思います。このために、ディレクトリ ハッシュを含むファイルを保存します。したがって、スキャンの前に、計算されたハッシュをファイル内の最後のハッシュと比較し、それらが等しい場合はスキャンをスキップできます。

4

1 に答える 1

4

変更を通知するQFileSystemWatcherクラスがあります。

ディレクトリとその内容の暗号化ハッシュを作成したい場合、これが私が行う方法です: -

void AddToHash(const QFileInfo& fileInf, QCryptographicHash& cryptHash)
{
    QDir directory(fileInf.absoluteFilePath());
    directory.setFilter(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files);
    QFileInfoList fileInfoList = directory.entryInfoList();

    foreach(QFileInfo info, fileInfoList)
    {
        if(info.isDir())
        {   
            // recurse through all directories
            AddToHash(info, cryptHash);
            continue;
        }

        // add all file contents to the hash
        if(info.isFile())
        {
            QFile file(info.absoluteFilePath());
            if(!file.open(QIODevice::ReadOnly))
            {      
                // failed to open file, so skip              
                continue;
            }
            cryptHash.addData(&file);
            file.close();
        }
    }
}

// create a fileInfo from the top-level directory
QFileInfo fileInfo(filePath);
QString hash;
// Choose an arbitrary hash, say Sha1
QCryptographicHash cryptHash(QCryptographicHash::Sha1);
// add all files to the hash
AddToHash(fileInfo, cryptHash);
// get a printable version of the hash
hash = cryptHash.result().toHex();
于 2013-11-08T16:51:31.653 に答える