在QFile::copy文档中它说
如果名称为 newName 的文件已经存在,则 copy() 返回 false(即 QFile 不会覆盖它)。
但即使目标存在,我也需要复制文件。Qt 中有什么可用的解决方法吗?
删除文件是显而易见的解决方案,但它会引发竞争条件......
在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");
}
但这仍然不是一个真正的解决方案,因为某些竞争条件不会阻止删除。
我目前正在寻找一种方法来处理将网页编写为输出,但在删除和复制之间没有自动刷新。
打电话remove()
前先打电话copy()