Sorry, I was a bit out of it when I wrote that example after spending the day trying to work out what was going wrong.
Anyway, I've spent another day and I think I've found the problem. It seems that if you add a directory, and then add some files in that directory, you can successfully remove the files, but any attempt to remove the directory fails. If you do things the other way around and add the files first, you can successfully remove the directory, but any attempts to remove the files fail.
I'm once again a bit delirious (need to get to bed) but let me try and write an example. Here I add the directory first and then the files, then try to remove them:
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>
int main()
{
fsWatcher.addPath("G:/TestFiles/Test1");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-1.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-2.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-3.txt");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
fsWatcher.addPath("G:/TestFiles/Test2");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-1.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-2.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-3.txt");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
return 0;
}
{
printf("Removing %d %s\n", itemList.size(), desc);
QStringList failList
= fsWatcher.
removePaths(itemList
);
if (failList.isEmpty())
{
printf("%s removed successfully\n", desc);
}
else
{
for (item = failList.constBegin() ; item != failList.constEnd() ; ++item)
printf("Remove fail - %s\n", item->toLatin1().data());
}
printf("\n");
}
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>
void RemoveItems(QFileSystemWatcher & fsWatcher, char* desc, QStringList Items);
int main()
{
QFileSystemWatcher fsWatcher;
fsWatcher.addPath("G:/TestFiles/Test1");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-1.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-2.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-3.txt");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
fsWatcher.addPath("G:/TestFiles/Test2");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-1.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-2.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-3.txt");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
return 0;
}
void RemoveItems(QFileSystemWatcher & fsWatcher, char* desc, QStringList itemList)
{
printf("Removing %d %s\n", itemList.size(), desc);
QStringList failList = fsWatcher.removePaths(itemList);
if (failList.isEmpty())
{
printf("%s removed successfully\n", desc);
}
else
{
QStringList::const_iterator item;
for (item = failList.constBegin() ; item != failList.constEnd() ; ++item)
printf("Remove fail - %s\n", item->toLatin1().data());
}
printf("\n");
}
To copy to clipboard, switch view to plain text mode
As you can see in the output, attempts to remove the directories fail:
Removing 3 Files
Files removed successfully
Removing 1 Directories
Remove fail - G:/TestFiles/Test1
Removing 3 Files
Files removed successfully
Removing 2 Directories
Remove fail - G:/TestFiles/Test1
Remove fail - G:/TestFiles/Test2
Removing 3 Files
Files removed successfully
Removing 1 Directories
Remove fail - G:/TestFiles/Test1
Removing 3 Files
Files removed successfully
Removing 2 Directories
Remove fail - G:/TestFiles/Test1
Remove fail - G:/TestFiles/Test2
To copy to clipboard, switch view to plain text mode
Below I've changed the main() function to first add the files then the directory:
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>
int main()
{
fsWatcher.addPath("G:/TestFiles/Test1/File 1-1.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-2.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-3.txt");
fsWatcher.addPath("G:/TestFiles/Test1");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
fsWatcher.addPath("G:/TestFiles/Test2/File 2-1.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-2.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-3.txt");
fsWatcher.addPath("G:/TestFiles/Test2");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
return 0;
}
{
printf("Removing %d %s\n", itemList.size(), desc);
QStringList failList
= fsWatcher.
removePaths(itemList
);
if (failList.isEmpty())
{
printf("%s removed successfully\n", desc);
}
else
{
for (item = failList.constBegin() ; item != failList.constEnd() ; ++item)
printf("Remove fail - %s\n", item->toLatin1().data());
}
printf("\n");
}
#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>
void RemoveItems(QFileSystemWatcher & fsWatcher, char* desc, QStringList Items);
int main()
{
QFileSystemWatcher fsWatcher;
fsWatcher.addPath("G:/TestFiles/Test1/File 1-1.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-2.txt");
fsWatcher.addPath("G:/TestFiles/Test1/File 1-3.txt");
fsWatcher.addPath("G:/TestFiles/Test1");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
fsWatcher.addPath("G:/TestFiles/Test2/File 2-1.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-2.txt");
fsWatcher.addPath("G:/TestFiles/Test2/File 2-3.txt");
fsWatcher.addPath("G:/TestFiles/Test2");
RemoveItems(fsWatcher, "Files", fsWatcher.files());
RemoveItems(fsWatcher, "Directories", fsWatcher.directories());
return 0;
}
void RemoveItems(QFileSystemWatcher & fsWatcher, char* desc, QStringList itemList)
{
printf("Removing %d %s\n", itemList.size(), desc);
QStringList failList = fsWatcher.removePaths(itemList);
if (failList.isEmpty())
{
printf("%s removed successfully\n", desc);
}
else
{
QStringList::const_iterator item;
for (item = failList.constBegin() ; item != failList.constEnd() ; ++item)
printf("Remove fail - %s\n", item->toLatin1().data());
}
printf("\n");
}
To copy to clipboard, switch view to plain text mode
Now attempts to remove the files fail:
Removing 3 Files
Remove fail - G:/TestFiles/Test1/File 1-1.txt
Remove fail - G:/TestFiles/Test1/File 1-2.txt
Remove fail - G:/TestFiles/Test1/File 1-3.txt
Removing 1 Directories
Directories removed successfully
Removing 6 Files
Remove fail - G:/TestFiles/Test1/File 1-1.txt
Remove fail - G:/TestFiles/Test1/File 1-2.txt
Remove fail - G:/TestFiles/Test1/File 1-3.txt
Remove fail - G:/TestFiles/Test2/File 2-1.txt
Remove fail - G:/TestFiles/Test2/File 2-2.txt
Remove fail - G:/TestFiles/Test2/File 2-3.txt
Removing 1 Directories
Directories removed successfully
Press <RETURN> to close this window...
Removing 3 Files
Remove fail - G:/TestFiles/Test1/File 1-1.txt
Remove fail - G:/TestFiles/Test1/File 1-2.txt
Remove fail - G:/TestFiles/Test1/File 1-3.txt
Removing 1 Directories
Directories removed successfully
Removing 6 Files
Remove fail - G:/TestFiles/Test1/File 1-1.txt
Remove fail - G:/TestFiles/Test1/File 1-2.txt
Remove fail - G:/TestFiles/Test1/File 1-3.txt
Remove fail - G:/TestFiles/Test2/File 2-1.txt
Remove fail - G:/TestFiles/Test2/File 2-2.txt
Remove fail - G:/TestFiles/Test2/File 2-3.txt
Removing 1 Directories
Directories removed successfully
Press <RETURN> to close this window...
To copy to clipboard, switch view to plain text mode
Hopefully those examples make sense this time
I'm not sure if this is a bug with QFileSystemWatcher or if I'm misunderstanding something. Anyway, I best take a shower and get to bed and I'll look into this more tomorrow morning.
Bookmarks