本以为复制文件是个很简单的事情,没想到居然需要超级管理员权限。
网上一搜有好多教程,例如这个:
给Qt程序添加管理员权限总结(一定有你没见过的方式)_qt管理员权限_百里杨的博客-CSDN博客当我们写了一个Qt程序,程序会在C盘某些目录下创建文件时,会发现代码没有问题,但是就是创建失败。而当我们对程序右键,以管理员权限运行时,又可以正常创建文件。此时,说明我们的程序默认不具备管理员权限,故而无法对某些目录进行写入。根据我们的编译器不同,有如下2种情况。一、使用MSVC编译器在pro文件中,添加如下一行:QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"重新编译之后,程序https://blog.csdn.net/zyhse/article/details/108166181然后配上复制文件的代码就ok了:
// 获取程序路径和需要复制的文件路径
QString programPath = QCoreApplication::applicationDirPath();
QString sourceFilePath = programPath+"/file.dat"; // 源文件路径
QString targetFilePath = "C:/file.dat"; // 目标文件路径
qDebug() << sourceFilePath;
QFile targetFile(targetFilePath);
if (!targetFile.exists()) {
// 复制文件
QFile sourceFile(sourceFilePath);
if (sourceFile.exists()) {
if (!QFile::copy(sourceFilePath, targetFilePath)) {
qDebug() << "Failed to copy file.";
}else
{
qDebug() << "Copy file success!";
}
} else {
qDebug() << "Source file does not exist.";
}
}else
{
qDebug() << "File exist.";
}
上面获取管理员权限的方式好是好,可是总感觉麻烦一些。
你或许没听说过这个VirtualStore功能:
VirtualStore是Windows操作系统中的一个虚拟文件夹,用于存储没有管理员权限的用户在受保护的目录中所做的更改。当用户尝试在受保护的目录中进行更改时,由于缺乏管理员权限,操作系统会将更改保存到VirtualStore文件夹中,而不是直接保存到原始目录中。
VirtualStore通常用于存储应用程序和用户数据的配置文件。在Windows Vista和更高版本的操作系统中,用户在Program Files和Windows目录下的文件夹中进行更改时,操作系统会将这些更改保存到VirtualStore文件夹中。这是因为这些目录是受保护的,只有管理员权限才能对其进行更改。
尽管VirtualStore可以帮助用户在没有管理员权限的情况下更改受保护的目录,但它也可能导致一些问题。例如,用户可能会忘记VirtualStore中的更改,导致应用程序无法正常工作。因此,开发人员需要了解VirtualStore的存在,并确保他们的应用程序能够正确处理VirtualStore中的数据。
为了解决这个问题,开发人员可以使用Qt提供的QStandardPaths类来获取应用程序的标准路径,以确保它们可以在任何Windows操作系统上正常工作。QStandardPaths类提供了许多静态函数来获取不同类型的标准路径,例如应用程序的配置目录、数据目录、缓存目录等。这些函数将自动考虑到VirtualStore的存在,并返回正确的路径。
除了使用QStandardPaths类之外,开发人员还可以通过在应用程序中使用程序数据目录而不是安装目录来避免使用VirtualStore。程序数据目录是指应用程序运行时保存数据和配置文件的目录。通过将这些文件保存在程序数据目录中,应用程序可以避免使用VirtualStore,并且可以在不同的Windows操作系统上正常工作。
对照图:
qt官方在线帮助文档:https://doc.qt.io/qt-5/qstandardpaths.html