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

ループがファイルを 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 に答える