【问题标题】:Copy file even when destination exists (in Qt)即使目标存在也复制文件(在 Qt 中)
【发布时间】:2013-02-02 20:39:55
【问题描述】:

QFile::copy 文档中它说

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

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

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

【问题讨论】:

  • Qt 有时真的很喜欢让你的生活变得艰难......他们可以简单地添加第三个可选参数来覆盖文件,但没有......

标签: c++ qt file-copying


【解决方案1】:

在拨打copy()之前先拨打remove()

【讨论】:

    【解决方案2】:
    if (QFile::exists("/home/user/dst.txt"))
    {
        QFile::remove("/home/user/dst.txt");
    }
    
    QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
    

    【讨论】:

    • 解决方案不是原子的。
    【解决方案3】:

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

    但是请注意,这样做会将代码打开到经典的 race condition,因为在典型的多任务操作系统上,不同的进程可能会在您的应用程序的删除和复制调用之间重新创建文件 .这会导致复制仍然失败,因此您需要做好准备(也许重新尝试删除,但这可能会引入计数需求,这样您就不会永远尝试等等)。

    【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 想象一下您没有文件权限来进行复制/删除。现在你有一个无限循环。
    猜你喜欢
    • 2018-11-16
    • 2018-04-07
    • 1970-01-01
    • 2023-03-17
    • 2015-08-12
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多