gpt4 book ai didi

c++ - QFile "remove()"不删除执行时众所周知的文件

转载 作者:行者123 更新时间:2023-11-28 04:33:52 25 4
gpt4 key购买 nike

我有一个进程被 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"

最佳答案

我设法删除了更改文件权限的文件:

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() 槽,然而,当process 仍在运行,因此文件被删除,它失去对文件的跟踪并崩溃。无论如何,我将创建另一篇文章来检查特定于此主题的答案。

感谢所有提供帮助的人!

关于c++ - QFile "remove()"不删除执行时众所周知的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com