在Qt中创建目录的哈希值

时间:2013-11-08 16:28:43

标签: c++ qt hash filesystems

是否有任何意思确定自上次访问以来目录内容(包括深层子目录结构)是否已更改?我正在寻找一种C / C ++的便携式解决方案,最好是在Qt。

P.S .: 如果相关,问题的背景。 在我的应用程序中,当某些条件为真时,我必须递归扫描许多目录并在数据库中导入一些数据。导入目录后,我用“.imported”文件标记它,然后忽略。

现在我想标记已扫描但未导入的目录。为此,我将存储一个包含目录哈希的文件。因此,在扫描之前,我可以将计算的哈希值与文件中的最后一个哈希值进行比较,如果它们相等则跳过扫描。

1 个答案:

答案 0 :(得分: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();