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

sas*_*alm 21 c++ qt file-copying

QFile :: copy文档中,它说

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

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

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

kar*_*lip 32

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

QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
Run Code Online (Sandbox Code Playgroud)

  • 解决方案不是原子的。 (2认同)

unw*_*ind 15

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

但请注意,这样做可以将代码打开到典型的竞争条件,因为在典型的多任务操作系统上,不同的进程可以应用程序的删除和复制调用之间重新创建文件.这将导致副本仍然失败,因此您需要做好准备(并且可能会重新尝试删除,但这可能会引入计数需求,因此您不会花费永远的尝试,并且不断尝试).

  • 这个答案是正确的 - 但这里有一些讽刺意味.[QFile :: copy()`本身的实际代码](https://github.com/radekp/qt/blob/6f5fb0be85b1d7cc9f93b615b5034c882e946301/src/corelib/io/qfile.cpp#L848)具有竞争条件. (3认同)

Rih*_*iho 5

打电话remove()前先打电话copy()


Lov*_*Tha 5

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

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

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

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

  • 想象一下,您没有进行复制/删除的文件权限。现在你有一个无限循环。 (7认同)