Reputation: 79595
In the QFile::copy documentation it says
If a file with the name newName already exists, copy() returns false (i.e., QFile will not overwrite it).
But I need to copy a file even if the destination exists. Any workaround available in Qt for that?
Deleting the file is the obvious solution but it invites a race condition...
Upvotes: 27
Views: 24348
Reputation: 93458
if (QFile::exists("/home/user/dst.txt"))
{
QFile::remove("/home/user/dst.txt");
}
QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
Upvotes: 43
Reputation: 1683
The simplest retrying I can think of is:
while !QFile::copy("/home/user/src.txt", "/home/user/dst.txt")
{
QFile::remove("/home/user/dst.txt");
}
But this still isn't a real solution as some of the race conditions are things that don't block remove.
I'm currently hunting for a way to handle writing a web page as an output but without the auto refresh ever catching between the remove and the copy.
Upvotes: 6
Reputation: 399949
The obvious solution is of course to delete the file if it exists, before doing the copy.
Note however that doing so opens up the code to a classic race condition, since on a typical multitasking operating system a different process could re-create the file between your applications' delete and copy calls. That would cause the copy to still fail, so you need to be prepared (and perhaps re-try the delete, but that might introduce a need for count so you don't spend forever attempting, and on and on).
Upvotes: 18