QFile“ remove()”不删除执行时众所周知的文件

时间:2018-08-29 17:04:30

标签: c++ qt qt5 qprocess qfile

我有一个由 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"

1 个答案:

答案 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()插槽,但是,当该过程仍在运行,因此文件被删除,并且无法跟踪文件并崩溃。无论如何,我将创建另一个帖子以检查特定于该主题的答案。

感谢大家的帮助!