我想在some/path/myfile
中复制$TMPDIR/myprog-<random-string>.ext
,以便我可以将其传递给第三方程序,该程序会阻止无扩展文件。
这是我想要的工作:
QString originalPath = "some/path/myfile";
QTemporaryFile f(
QDir::temp().absoluteFilePath("mprog-XXXXXX.ext")
);
// f.open(); ?
QFile(originalPath).copy(f.fileName());
但是,我现在有一个问题 - 文件尚未存在,因此尚未分配临时fileName()
,或文件名已分配,但文件本身已存在,阻止新文件被复制到顶部。
如何在QT中将文件复制到临时位置,并在调用QTemporaryFile的析构函数时删除临时副本?
答案 0 :(得分:2)
如果文件不存在,请完全按照您的操作创建QTemporaryFile
对象,打开它然后立即关闭它。这将生成随机文件名并在磁盘上创建它。
当您的QTemporaryFile
对象被销毁时,该文件将从磁盘中删除。
答案 1 :(得分:1)
不幸的是,Qt(5.3)并不支持复制到现有文件。 QTemporaryFile
唯一正确的,无种族使用是open()
,在此过程中创建它,然后对其进行操作。
你自己需要自己实施这个副本,我很害怕:(
在Windows上,如果您希望使用CopyFileEx
获得一些收益,我会a complete example将其包含在Qt的阅读中,并附带进度信号。
真正的问题是:你真的需要创建副本吗?不是硬链接吗?由于Qt在大多数情况下运行在Unices和Windows上,因此您可以创建一个符号链接包装器,它将包装POSIX link()
和winapi CreateHardLink
。如果硬链接创建失败,或临时文件夹位于其他卷上,则可以尝试CreateSymbolicLink
。当然,如果您打算让可执行文件完全启动XP,那么您需要使用CreateSymbolicLinkW
查找QLibrary
。如果失败,你要么在XP上运行,要么在FAT分区上运行,最后的回退就是复制。
重命名文件,在其上运行第三方应用程序,然后将其重命名,是不可能的?
答案 2 :(得分:0)
如果您实际上不打算将文件/流使用到为您创建的文件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扩展名更改为适合您的文件类型的文件。