我有一个由 QProcess * 调用的进程。创建完成后,我将其 finished()信号连接到插槽,该插槽将删除一些生成的文件。此过程将创建一组在执行时众所周知的文件。我正在为每个对象创建一个 QFile * 对象。我正在尝试指定过程完成后的那些文件。
问题是:如果我尝试使用 QFile :: remove()或 QDir :: remove()删除它们,似乎什么也没发生。但是,如果我尝试重命名它们,它会重命名,但是之前已经完成-即使发出了完成的信号,该过程也已完成。此外, QDir :: removeRecursively()也会删除它们。我试图创建一个新目录,将文件移动到该文件夹并使用 Qdir :: removeRecursively()-甚至删除了我的所有桌面-但是,正如我所说,“删除文件”插槽在过程真正完成之前被调用。我尝试使用 QProcess :: waitForFinished()阻止此过早的调用,但是没有用。
顺便说一句,我要问用户将文件保存在哪里,以便在尝试删除文件时可以将它们保存在任何地方。另外,我不能要求管理员特权。
谢谢!
QProcess调用
QProcess *execute_call = new QProcess(this);
execute_call->setWorkingDirectory(lastSavingLocation + "/control/");
execute_call->setProgram(execute_call->workingDirectory() + "execute.bat");
connect(execute_call, SIGNAL(finished(int)), this, SLOT(DeleteExecutionFiles(int)));
execute_call->start();
execute_call->waitForFinished(-1);
//I tried to put this
//before the start() call, but nothing seems to change
删除文件插槽
void MainWindow::DeleteExecutionFiles(int status)
{
if(status == 0)
{
qDebug() << "slot called";
QFile *lof_mh = new QFile(lastSavingLocation + "/lof-mh.exe");
QFile *libgomp = new QFile(lastSavingLocation + "/libgomp-1.dll");
QFile *libwin = new QFile(lastSavingLocation + "/libwinpthread-1.dll");
QFile *tests_env = new QFile(lastSavingLocation + "/control/lof-mh-testenvironment-tool.exe");
QFile *execute = new QFile(lastSavingLocation + "/control/execute.bat");
QFile *execute_bat = new QFile(lastSavingLocation + "/control/executeParallel.bat");
lof_mh->setFileName(lastSavingLocation + "/lof-mh.exe");
libgomp->setFileName(lastSavingLocation + "/libgomp-1.dll");
libwin->setFileName(lastSavingLocation + "/libwinpthread-1.dll");
tests_env->setFileName(lastSavingLocation + "/control/lof-mh-testenvironment-tool.exe");
execute->setFileName(lastSavingLocation + "/control/execute.bat");
execute_bat->setFileName(lastSavingLocation + "/control/executeParallel.bat");
lof_mh->remove();
libgomp->remove();
libwin->remove();
tests_env->remove();
execute->remove();
execute_bat->remove();
}
}
编辑1
将 qDebug()与 QFile :: errorString()一起使用后,得到了这个
lof_mh.remove();
qDebug() << lof_mh.errorString(); //"Negated Access"
libgomp.remove();
qDebug() << libgomp.errorString(); //"Negated Access"
libwin.remove();
qDebug() << libwin.errorString(); //"Negated Access"
tests_env.remove();
qDebug() << tests_env.errorString(); //"Negated Access"
execute.remove();
qDebug() << execute.errorString(); //"Unknown Error"
execute_bat.remove();
qDebug() << execute_bat.errorString(); //"Unknown Error"
答案 0 :(得分:1)
我设法通过以下方式删除了更改文件权限的文件:
lof_mh.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser);
libgomp.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser);
libwin.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser);
tests_env.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser);
execute.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser);
execute_bat.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser);
在那之后,我像往常一样使用QFile :: remove()删除了它们。但是,这带来了另一个问题:当QProcess *的 finished()信号被发出时,应该调用 DeleteFiles()插槽,但是,当该过程仍在运行,因此文件被删除,并且无法跟踪文件并崩溃。无论如何,我将创建另一个帖子以检查特定于该主题的答案。
感谢大家的帮助!