复制文件,即使目标存在(在Qt中)

Copy file even when destination exists (in Qt)

本文关键字:Qt 存在 目标 文件 复制      更新时间:2023-10-16

在QFile::copy文档中,它显示

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

但是,即使目的地存在,我也需要复制一个文件。Qt中有什么解决方法吗?

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

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

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

然而,请注意,这样做会使代码处于经典的竞争条件,因为在典型的多任务操作系统上,不同的进程可能会在应用程序的删除和复制调用之间重新创建文件。这会导致复制仍然失败,所以你需要做好准备(也许可以重新尝试删除,但这可能会带来计数的需要,这样你就不会花太多时间尝试了)。

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

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

但这仍然不是一个真正的解决方案,因为一些比赛条件并不能阻止移除。

我目前正在寻找一种方法来处理将网页作为输出进行编写,但不需要在删除和复制之间进行自动刷新。

在调用copy() 之前只需调用remove()