我想制作一份some/path/myfilein 的副本$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());
Run Code Online (Sandbox Code Playgroud)
但是,我现在有一个问题 - 文件尚未存在,因此尚未分配临时fileName()文件,或文件名已分配,但文件本身已存在,阻止新文件被复制到顶部.
如何在QT中将文件复制到临时位置,并在调用QTemporaryFile的析构函数时删除临时副本?
我正在处理非常大的文件,大小超过数百GB.用户需要能够在磁盘之间移动这些文件,并且是在没有默认文件管理器的受限系统上.用户可能会意识到他们犯了错误并取消了操作,据我所知,用户必须等待当前的复制或重命名操作才能完成.这可能让他们感到沮丧,因为他们等待了几分钟,只是看到他们的许多GB文件仍然被复制.在复制的情况下,我可以删除第二个文件,但在重命名的情况下,我用来移动文件,我必须反向重复操作以撤消它,这是不可接受的.
有没有办法中断我在QFile文档中没有看到的copy()和rename(),或者我需要将自己的类放在一起来处理复制和重命名?
我正在开发一个应用程序,需要使用QT(5.6.1)将大量文件从一个文件夹复制到另一个文件夹
为此,我一直在使用这种QFile::copy()方法.这样做很有效,除了一件事:它非常慢.使用Windows资源管理器执行相同的复制操作所需的时间超过两倍.
想知道为什么会这样,我挖了QT源代码,我发现了这个qfile.cpp,看起来很相关:
char block[4096];
qint64 totalRead = 0;
while(!atEnd()) {
qint64 in = read(block, sizeof(block));
if (in <= 0)
break;
totalRead += in;
if(in != out.write(block, in)) {
close();
d->setError(QFile::CopyError, tr("Failure to write block"));
error = true;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,据我所知,复制操作使用4096字节的缓冲区.这对于复制操作来说非常小,很可能是问题的原因.所以我做的是将缓冲区的大小更改为:
char block[4194304]; // 4MB buffer
Run Code Online (Sandbox Code Playgroud)
然后我重建了整个QT库以包含此更改.但是,所有的修改都完全打破了这个方法.现在,当我的应用程序尝试调用QFile :: Copy()时,操作立即中断(方法甚至没有开始运行,根据QtCreator的调试器在第一行之前停止).调试器告诉我:
The inferior stopped because it received a signal from the Operating System.
Signal name :
SIGSEGV
Signal meaning :
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我的c …