即使目的地存在,也要复制文件(在Qt中)

时间:2013-02-18 12:07:06

标签: c++ qt file-copying

QFile::copy文档中说

  

如果名称为newName的文件已存在,则copy()返回false   (即QFile不会覆盖它)。

但即使目标存在,我也需要复制文件。 Qt中有哪些可用的解决方法?

删除文件是一个显而易见的解决方案,但它会引发竞争条件......

4 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:15)

显而易见的解决方案当然是在复制之前删除文件(如果存在)。

但请注意,这样做可以将代码打开到经典race condition,因为在典型的多任务操作系统上,不同的进程可以在应用程序的删除和之间重新创建文件。复制电话。这会导致副本仍然失败,所以你需要做好准备(并且可能会重新尝试删除,但这可能会引入计数需求,这样你就不会花费太多的时间来尝试,而且一次又一次)。

答案 2 :(得分:5)

我能想到的最简单的重试是:

while !QFile::copy("/home/user/src.txt", "/home/user/dst.txt")
{
    QFile::remove("/home/user/dst.txt");
}

但这仍然不是一个真正的解决方案,因为一些竞争条件是不会阻止删除的事情。

我目前正在寻找一种处理将网页编写为输出的方法,但是在删除和复制之间没有自动刷新。

答案 3 :(得分:4)

只需在copy();

之前调用remove()