【问题标题】:Creating a hash-value of a directory in Qt在 Qt 中创建目录的哈希值
【发布时间】:2013-11-08 16:28:43
【问题描述】:

是否有任何方法可以确定自上次访问后目录内容(包括深层子目录结构)是否发生了变化?我正在寻找 C/C++ 中的可移植解决方案,最好在 Qt 中。

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

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

【问题讨论】:

  • 为什么有些目录被扫描了但没有导入?导入的目录在那之后被认为是静态的,对吧(否则,标志就没有意义了)?你在寻找什么改变?另外,您将如何在扫描之前计算哈希值?我想,我在你的问题中遗漏了一些东西。
  • 也许对所有文件和目录进行简单的修改时间检查就足够了?您可以节省一次扫描的时间,并在需要测试是否需要再次扫描时与之进行比较。
  • @TilmanVogel:我正在扫描数据的完整性。这些目录被 3 个程序使用。一个创建数据,另一个分析和注释数据,最后一个将数据传输到数据库。只有完整注释的数据才会传输到 DB。注释可能需要几天时间,并且可能在几个会话中完成,而不是一次完成。仅当所有数据文件的 xml 文件都存在时,注释才被认为是完整的。杰斯,在数据库传输之后,目录被“密封”了。
  • @userr1728854:是的,看起来不错。我希望有一些可以使用的东西。

标签: c++ qt hash filesystems


【解决方案1】:

有一个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();

【讨论】:

  • 这只有在您一直观看时才会有所帮助。另外,如果我没记错的话,创建大量观察者来观察整个层次结构可能会占用大量资源,尤其是在 Windows 上。
  • 是的,所以我更新了答案以包含使用 Qt 获取目录哈希的方法;O)
  • +1 看起来不错,速度也很快!除了一些小的错别字似乎有效(AddtoHash vs AddToHash 和 cryptHash.addData(&file) )。第二天我会彻底测试并选择答案。我将尝试的两个修改是:对哈希使用时间戳,而不是对内容使用文件过滤器(在我的情况下,只有 xml 文件可能会更改)。
  • 我已更正了 AddToFile 错字;感谢您指出。让我知道进展如何;O)
猜你喜欢
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2016-01-27
  • 2017-05-04
相关资源
最近更新 更多