2013-02-18 75 views
11

QFile::copy文档,它说复制文件,即使存在(在QT)

如果名为了newName的文件已存在的目的地,复制()返回false (即QFile时不会覆盖它) 。

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

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

+3

['QFile :: remove'](http://doc.qt.digia.com/qt/qfile.html#remove-2)? – 2013-02-18 12:09:01

+4

Qt真的很喜欢让你的生活变得艰难..他们可以简单地添加第三个可选参数来覆盖文件,但是没有.. – cen 2013-11-25 10:54:35

回答

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

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

只需拨打副本之前删除()();

13

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

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

+2

这个答案是正确的 - 但这里有一些讽刺意味。 [QFile :: copy()'本身的实际代码](https://github.com/radekp/qt/blob/6f5fb0be85b1d7cc9f93b615b5034c882e946301/src/corelib/io/qfile.cpp#L848)具有争用条件。 – 2016-01-22 03:31:53

4

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

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

但是,这还不是一个真正的解决办法,因为一些比赛条件的东西不禁止删除。

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