0

我需要监视一个文件系统,我有一个函数可以递归地浏览文件夹和文件,并将它们的路径添加到我的 QFileSystemWatcher :

void watchFileSystem(const QDir& dir, QFileSystemWatcher& watcher)
{
    watcher.addPath(dir.absolutePath());
    QDirIterator iterator(dir.absolutePath(), QDirIterator::Subdirectories);
    while (iterator.hasNext()) {
        QString foldername = QString(iterator.fileName());
        if (foldername != "." && foldername != ".." && foldername != "")
            watcher.addPath(iterator.filePath());
        iterator.next();
        if (!iterator.fileInfo().isDir()) {
            watcher.addPath(iterator.filePath());
        }
    }
}

运行时,每个“watcher.addPath(iterator.filePath());” 我在控制台中有此错误消息:

QFileSystemWatcher:添加路径失败:C:/.../anyfile.ext

最奇怪的是它仍然有效。当我重命名/编辑文件或文件夹时,会触发 fileChanged 和 folderChanged 事件。

任何人都知道发生了什么?我担心我的程序不稳定,这个错误不能白白显示。

感谢阅读和帮助,

拉斐尔。

4

1 回答 1

2

显示警告是因为您的循环添加了两次文件:

在循环的中间,您执行iterator.next();. 如果这会将迭代器移动到文件中,它将被添加到下一个 if 语句中。现在你的循环继续,但仍然指向同一个文件。如果文件夹名称不是“.”、“..”或“”,则不是文件,则再次添加相同的文件。

我已经重组了您的循环以使其工作:

while (iterator.hasNext()) 
{    
    QString fileOrFolderName = QString(iterator.fileName());

    // Skip non-folders
    if (fileOrFolderName == "." || fileOrFolderName == ".." || 
        fileOrFolderName == "")
    {
        iterator.next();
        continue;
    }

    // Add the folder or file
    watcher.addPath(iterator.filePath());
    iterator.next();
}

这将在提供给函数的目录下添加所有文件夹和文件。

于 2012-09-27T07:47:00.793 回答