无法删除以前由 Win 7 上的 Qt 4.8 中的应用程序创建的文件
Posted
技术标签:
【中文标题】无法删除以前由 Win 7 上的 Qt 4.8 中的应用程序创建的文件【英文标题】:Can't remove file previously created by the application in Qt 4.8 on Win 7 【发布时间】:2016-05-26 21:38:12 【问题描述】:我已将 .bat 文件从 Qt-ressources 复制到文件系统并执行它。 之后我想删除该文件,但在 Qt 中失败了。如果在我重新启动应用程序时也失败。但是,可以在文件资源管理器中删除该文件。
我试过QFile::remove
和QDir::remove
。静态和非静态版本 - 没有效果。
我尝试使用本机文件分隔符进行调用 - 也没有帮助。
这段代码有什么问题?
if ( QFileInfo( dataRootPath+"/backupdb.bat" ).exists() )
//debugger stepps in
QFile f( QFileInfo( dataRootPath+"/backupdb.bat" ).canonicalFilePath());
f.remove( );
【问题讨论】:
我猜这很可能是权限问题。你能从资源管理器中删除文件吗? 失败说明了什么? @CristiFati 你是什么意思? QFile::remove 返回布尔值。结果是“假” @Murphy 是:“但是,可以在文件资源管理器中删除该文件。”为什么是权限问题?该文件是从同一用户创建和删除的。 Win 7 中的应用程序可以有不同的权限吗?在这种情况下 Explorer 比 VisualStudio 拥有更多权限? 当然:QFile::error()
和 errorString()
。在线参考是您的朋友。检查权限只是从您的描述中得出的第一个猜测;也许您的应用程序正在其他用户上下文中运行。
【参考方案1】:
我在将文件从资源复制到文件系统并在此之后尝试将其删除时遇到了同样的问题。 QFile::errorString() 返回“拒绝访问”。因此,资源文件似乎具有一些由 QFile::copy 复制的令人讨厌的权限。可能可以更改权限,但我使用自己的 2 个函数来复制文件:
bool copyTextFile(QString srcPath, QString dstPath)
QFile file(srcPath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
return writeTextFile(QString::fromUtf8(file.readAll()), dstPath);
bool writeTextFile(QString data, QString dstPath)
QFile file(dstPath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
QTextStream stream(&file);
stream << data;
return true;
【讨论】:
【参考方案2】:我在删除它之前更改了它的权限。
QFile::copy(":/res/1.txt", "D:\\1.txt");
QFile file("D:\\1.txt");
file.setPermissions(file.permissions() |
QFileDevice::WriteOwner |
QFileDevice::WriteUser |
QFileDevice::WriteGroup |
QFileDevice::WriteOther);
file.remove();
【讨论】:
【参考方案3】:我遇到了同样的错误,但在我的情况下,发布的解决方案不起作用。然而,事实证明我在我的代码中创建了一个std::ofstream
对象,它是未关闭的。因此,这会使源文件保持打开状态,从而阻止在 Windows 上进行复制。
【讨论】:
以上是关于无法删除以前由 Win 7 上的 Qt 4.8 中的应用程序创建的文件的主要内容,如果未能解决你的问题,请参考以下文章
Qt 4.8:显示窗口时选择 QPushButton 上的文本
Windows 上的 Qt 5.1.0 使用 minGW 4.8 需要很长时间才能调试
我是win7 64位的系统,下载了Qt 5.2.1 for Windows 32-bit (MinGW 4.8, OpenGL, 634 MB)请安装过的大神