Details
-
Bug
-
Resolution: Won't Do
-
P3: Somewhat important
-
None
-
5.4.1
-
None
-
linux 3.19.3
Description
QFileSystemWatchers reaction to a file rename is weird.
What it does:
If a watched dir 'A' gets renamed to e.g. 'B', following directoryChanged signals report 'A' instead of the new name. The list of watched directories is reports 'A' but not 'B'.
What it shoulf do:
If a watched dir 'A' gets renamed to e.g. 'B', following directoryChanged signals report 'B'. The list of watched directories is reports 'B' as watched.
See the following or download the attachment.
QDir d = QDir::temp(); d.mkpath("TEST/A"); qDebug() << "mkdir " << d.absoluteFilePath("TEST/A"); d.rmpath("TEST/B"); // For multiple runs d.rmpath("TEST/C/D"); // For multiple runs QFileSystemWatcher fsw; fsw.addPath(d.absoluteFilePath("TEST")); fsw.addPath(d.absoluteFilePath("TEST/A")); QObject::connect(&fsw, &QFileSystemWatcher::directoryChanged, [&](const QString & path){ qDebug() << "\ndirectoryChanged:" << path; qDebug() << "-> directories" << fsw.directories(); }); QObject::connect(&fsw, &QFileSystemWatcher::fileChanged, [&](const QString & path){ qDebug() << "\nFILE!!!!!!!:" << path; }); QTimer::singleShot(1000, [&](){ qDebug() << "\nRename A to B"; d.rename("TEST/A","TEST/B"); qDebug() << "-> directories" << fsw.directories(); }); QTimer::singleShot(2000, [&](){ qDebug() << "\nAdd dir C in B"; d.mkpath("TEST/B/C"); qDebug() << "-> directories" << fsw.directories(); }); QTimer::singleShot(3000, [&](){ qDebug() << "\nRemove dir C in B"; d.rmdir("TEST/B/C"); qDebug() << "-> directories" << fsw.directories(); }); QTimer::singleShot(4000, [&](){ qDebug() << "\nRemove dir B"; d.rmdir("TEST/B"); qDebug() << "-> directories"<< fsw.directories(); }); QTimer::singleShot(5000, [&](){ qDebug() << "\nRemove dir TEST"; d.rmdir("TEST/"); qDebug() << "-> directories"<< fsw.directories(); });
Produces this output:
mkdir "/tmp/TEST/A" Rename A to B -> directories ("/tmp/TEST", "/tmp/TEST/A") # this may still be okay directoryChanged: "/tmp/TEST" -> directories ("/tmp/TEST", "/tmp/TEST/A") # this and the following not Add dir C in B -> directories ("/tmp/TEST", "/tmp/TEST/A") # <<< directoryChanged: "/tmp/TEST/A" # <<< -> directories ("/tmp/TEST", "/tmp/TEST/A") # <<< Remove dir C in B -> directories ("/tmp/TEST", "/tmp/TEST/A") # <<< directoryChanged: "/tmp/TEST/A" -> directories ("/tmp/TEST", "/tmp/TEST/A") # <<< Remove dir B -> directories ("/tmp/TEST", "/tmp/TEST/A") # <<< directoryChanged: "/tmp/TEST/A" # <<< -> directories ("/tmp/TEST") directoryChanged: "/tmp/TEST" -> directories ("/tmp/TEST") Remove dir TEST -> directories ("/tmp/TEST") directoryChanged: "/tmp/TEST" -> directories ()}}