【问题标题】:QT copy to QTemporaryFileQT 复制到 QTemporaryFile
【发布时间】:2014-07-29 12:31:39
【问题描述】:

我想在$TMPDIR/myprog-<random-string>.ext 中复制some/path/myfile,这样我就可以将其传递给第三方程序,该程序会阻塞无扩展名的文件。

这是我想做的工作:

QString originalPath = "some/path/myfile";

QTemporaryFile f(
    QDir::temp().absoluteFilePath("mprog-XXXXXX.ext")
);

// f.open(); ?

QFile(originalPath).copy(f.fileName());

但是,我现在有一个问题 - 文件尚不存在,因此尚未分配临时 fileName(),或者文件名已分配但文件本身已存在,从而阻止了新的文件被复制到顶部。

如何将文件复制到 QT 中的临时位置,并在调用 QTemporaryFile 的析构函数时删除临时副本?

【问题讨论】:

    标签: c++ qt temporary-files


    【解决方案1】:

    如果该文件不存在,请完全按照您的操作创建QTemporaryFile 对象,打开它然后立即关闭它。这将生成随机文件名并在磁盘上创建它。

    当您的QTemporaryFile 对象被销毁时,该文件将从磁盘中删除。

    【讨论】:

    • 当它存在于磁盘上时,.copy( 将拒绝复制并覆盖它
    • 来自文档:“请注意,如果名称为 newName 的文件已经存在,则 copy() 返回 false...”
    • 也来自文档:“临时文件的名称保证是唯一的(即,您保证不会覆盖现有文件),并且该文件随后将在销毁时被删除QTemporaryFile 对象”
    【解决方案2】:

    很遗憾,Qt (5.3) 不支持复制到现有文件。 QTemporaryFile 唯一正确、无竞争的用法是 open() 它,在此过程中创建它,然后对其进行操作。

    恐怕你需要自己实现副本:(

    在 Windows 上,如果您希望使用 CopyFileEx 会有所收获,我有 a complete example 包装它以供 Qt 阅读,并带有进度信号。

    真正的问题是:您真的需要创建副本吗?不是硬链接吗?由于 Qt 在很大程度上是在 Unices 和 Windows 上运行的,因此您可以创建一个符号链接包装器来包装 POSIX link() 和 winapi CreateHardLink。如果硬链接创建失败,或者临时文件夹位于不同的卷上,您可以尝试CreateSymbolicLink。当然,如果您希望您的可执行文件完全启动 un XP,您需要使用 QLibrary 查找 CreateSymbolicLinkW。如果失败,您要么在 XP 上运行,要么在 FAT 分区上运行,最终的回退是复制。

    重命名文件,在其上运行第 3 方应用程序,然后重命名它是不可能的吗?

    【讨论】:

      【解决方案3】:

      如果您不打算实际使用文件/流到为您创建的文件 QTemporaryFile,您最好使用 QUuid 而不是只生成一个有保证的唯一文件名。这会生成一个唯一的文件名,大致相当于 QTemporaryFile:

      QUuid uuid = QUuid::createUuid();
      QString tempFileFullPath = QDir::toNativeSeparators(QDir::tempPath() + "/" + qApp->applicationName().replace(" ", "") + "_" + uuid.toString(QUuid::WithoutBraces) + ".dat");
      

      我喜欢临时文件名不包含空格,所以我从用于文件名前缀的应用程序名称中删除了它。 (你应该在你的 main() 函数中调用 QApplication::setApplicationName 这样它才会起作用。)

      此外,您可能应该将 .dat 扩展名更改为适合您文件类型的内容。

      【讨论】:

        猜你喜欢
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多