DeleteFile error code 5

血虐丘比特 2016-01-29 11:48:01
问题背景
update.exe,test.exe,test.dll,这些程序都是自己做的

流程
update.exe负责更新test.exe所使用的test.dll

1.update.exe使用taskkill杀死test.exe
2.update使用DeleteFile删除test.dll,重启拷贝一个新的test.dll
3.update.exe启动test.exe

问题描述
1.每天第一次更新时,DeleteFile失败,error code 是5(拒绝访问)
2.后面无论隔多久进行更新都是成功的,

这里我就不明白为什么会这样,早上8:00上班更新失败,再更新一次就成功了,等到晚上10:00更新还是成功的;第二天早上第一次更新又失败了,继续更新有事成功的,有谁遇到过这种问题
源码如下:
#ifdef Q_OS_WIN
CopyFile(dirDest.filePath(fileInfo.fileName()).toStdWString().c_str(),dirBack.filePath(fileInfo.fileName()).toStdWString().c_str(),false);
if(!DeleteFile(dirDest.filePath(fileInfo.fileName()).toStdWString().c_str()))
{
int error = GetLastError();
ui->listLog->insertItem(0, QObject::tr("[%1] Delete %2 failure under %3 [%4]")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(fileInfo.fileName())
.arg(dirDest.absolutePath()).arg(error));
}
if(!CopyFile(fileInfo.filePath().toStdWString().c_str(),dirDest.filePath(fileInfo.fileName()).toStdWString().c_str(),false))
{
int error = GetLastError();
ui->listLog->insertItem(0, QObject::tr("[%1] Copy %2 to %3 failure [%4]")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(fileInfo.absoluteFilePath())
.arg(dirDest.absolutePath()).arg(error));
return 7;
}
#else
QFile::copy(dirDest.filePath(fileInfo.fileName()),dirBack.filePath(fileInfo.fileName()));
if(!QFile::remove(dirDest.filePath(fileInfo.fileName())))
{
ui->listLog->insertItem(0, QObject::tr("[%1] Delete %2 failure under %3")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(fileInfo.fileName())
.arg(dirDest.absolutePath()));
return 6;
}
if(!QFile::copy(fileInfo.filePath(),dirDest.filePath(fileInfo.fileName())))
{
ui->listLog->insertItem(0, QObject::tr("[%1] Copy %2 to %3 failure ...")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(fileInfo.absoluteFilePath())
.arg(dirDest.absolutePath()));
return 7;
}
#endif
...全文
472 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
血虐丘比特 2016-02-02
  • 打赏
  • 举报
回复
这个问题就这样吧,稍微做了一下优化,要是有更好的方法可以提供一下

QProcess process;
if(m_nSlavePID)
{
        //! QProcess::execute("taskkill /F /T /PID " + QString::number(m_nSlavePID));
        process.start("taskkill",QStringList()<<"/F /T /PID"+QString::number(m_nSlavePID),QProcess::ReadOnly);
        process.waitForFinished();
        Sleep(1);
        m_nSlavePID = 0;
}
process.start("tasklist",QProcess::ReadOnly);
process.waitForFinished();
QTextStream Stream(&process);
while (!Stream.atEnd())
 {
        QString strLine = Stream.readLine();
        qDebug()<<strLine;
        if(strLine.contains(m_SlaveAppName,Qt::CaseInsensitive))
        {
            //! 如果slave没有杀掉再杀一次
            //! QProcess::execute("taskkill /F /T /IM " + m_SlaveAppName);
            process.start("taskkill",QStringList()<<"/F /T /IM " + m_SlaveAppName,QProcess::ReadOnly);
            process.waitForFinished();
            Sleep(1);
            m_nSlavePID = 0;
            break;
      }
 }
血虐丘比特 2016-02-02
  • 打赏
  • 举报
回复
是的,加上Sleep(3),感觉这样不是可靠的方法,要是有什么方法能检测占用就好了,我现在只能在杀死之后再检测一下+Sleep来做
QFileInfo fileinfo = QFileInfo(m_strSlaveApplication);
        QString m_SlaveAppName = fileinfo.fileName();
        if(m_nSlavePID)
        {
            QProcess::execute("taskkill /F /T /PID " + QString::number(m_nSlavePID));
            Sleep(3);
            m_nSlavePID = 0;
        }
        QProcess process;
        process.start("tasklist",QProcess::ReadOnly);
        process.waitForFinished();
        QTextStream Stream(&process);
        while (!Stream.atEnd())
        {
            QString strLine = Stream.readLine();
            qDebug()<<strLine;
            if(strLine.contains(m_SlaveAppName,Qt::CaseInsensitive))
            {
                //! 如果slave没有杀掉再杀一次
                QProcess::execute("taskkill /F /T /IM " + m_SlaveAppName);
                Sleep(3);
                m_nSlavePID = 0;
                break;
            }
        }
bigfog 2016-02-01
  • 打赏
  • 举报
回复
建议杀死test.exe进程后,先Sleep(500),确定进程结束后,再DeleteFile
血虐丘比特 2016-02-01
  • 打赏
  • 举报
回复
自己顶一下~

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧