我需要monitore一个文件系统,我有一个函数可以递归浏览文件夹和文件,并将它们的路径添加到我的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事件。
任何人都知道发生了什么? 我担心程序不稳定,这个错误无法显示。
感谢阅读和帮助,
圣拉斐尔。
答案 0 :(得分:1)
显示警告是因为您的循环添加了两次文件:
在循环中间,您执行iterator.next();
。
如果将迭代器移动到文件,它将被添加到下一个if语句中。现在你的循环继续,但仍然指向同一个文件。如果foldername不是“。”,“..”或“”,而不是文件,则会再次添加相同的文件。
我重构了你的循环以使它工作:
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();
}
这将添加提供给该功能的目录下的所有文件夹和文件。