QFile "remove ()" не удаляет файлы, которые хорошо известны во время выполнения - PullRequest
0 голосов
/ 29 августа 2018

У меня есть процесс, вызываемый QProcess *. После создания я подключаю его сигнал закончено () к слоту, который удаляет некоторые полученные файлы. Этот процесс создает набор файлов, которые хорошо известны во время выполнения. Я создаю QFile * объект для каждого из них. Я пытаюсь удалить эти файлы после , когда указанный процесс завершен.

Проблема заключается в следующем: если я пытаюсь удалить их с помощью QFile :: remove () или QDir :: remove () , похоже, ничего не происходит. Однако, если я пытаюсь переименовать их, он переименовывается, но за до процесс завершается - даже если его завершенный сигнал был отправлен. Также, QDir :: removeRecursively () удаляет их. Я попытался создать новый каталог, переместить файлы в эту папку и использовать Qdir :: removeRecursively () - и даже удалил весь мой рабочий стол - но, как я уже сказал, слот для удаления файлов вызывается до того, как процесс действительно завершится. Я пытался использовать QProcess :: waitForFinished () , чтобы предотвратить этот преждевременный вызов, но это не сработало.

Кстати, я спрашиваю пользователя, где сохранить файлы, чтобы они могли быть сохранены где угодно, когда я пытаюсь их удалить. Кроме того, я не могу запросить права администратора.

Спасибо!

QProcess call

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

Слот DeleteFiles

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 голосов
/ 29 августа 2018

Мне удалось удалить файлы, изменив права доступа к файлам с помощью:

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 (), как обычно. Это порождает еще одну проблему: слот DeleteFiles () должен вызываться, когда сигнал QProcess * finish () вызывается, но слот вызывается при выполнении процесса. по-прежнему работает , поэтому файлы удаляются, и он теряет отслеживание файлов и вылетает. В любом случае, я создам еще один пост, чтобы проверить ответы, специфичные для этой темы.

Спасибо всем, кто помог!

...