Copy file even when destination exists (in Qt)

不羁岁月 提交于 2019-12-04 15:46:13

问题


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...


回答1:


if (QFile::exists("/home/user/dst.txt"))
{
    QFile::remove("/home/user/dst.txt");
}

QFile::copy("/home/user/src.txt", "/home/user/dst.txt");



回答2:


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).




回答3:


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.




回答4:


Just call remove() before calling copy()



来源:https://stackoverflow.com/questions/14935919/copy-file-even-when-destination-exists-in-qt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!