2

以下程序在 Windows 7 上使用 Visual Studio 2010 编译时不起作用:

#include <stdio.h>

int main()
{
    int status;

    status = rename("C:\\Temp\\A.dat","C:\\Temp\\a.dat");
    status = rename("C:\\ProgramData\\A.dat","C:\\ProgramData\\a.dat");

    return 0;
}

第一次重命名有效,但第二次重命名无效。rename 函数在这两种情况下都返回 0。c:\ProgramData 有什么特别之处可以使区分大小写的重命名不起作用?

仅供参考,该程序在使用 cygwin gcc 4.8.3 编译时运行良好。

4

1 回答 1

1

C:\ProgramData具有阻止标准用户在那里写入的安全设置。这不是新的Windows 8Windows 7是相同的,并且相同的文件夹Vista也是以这种方式保护的。也许您Windows 7的 UAC 环境没有禁用,或者您已保护C:\ProgramDataC:\ProgramData\MyProgramName允许标准用户的写访问。

关于 UAC 你必须做的事情

当微软推出UAC时,他们需要一种方法让旧应用程序至少在一段时间内继续工作。他们想出的是“文件和注册表虚拟化”,其中试图访问(现在)禁止的系统文件夹或注册表条目的遗留应用程序将被重定向到他们自己的用户特定的这些资源的“虚拟化”副本。作为关于UAC的 Wikipedia 文章。

直截了当地说,ProgramData 包含非用户特定的应用程序数据。该数据将可供计算机上的所有用户使用。

有几种方法可以使用此文件夹。某些应用程序仅在安装期间在安装程序进程运行提升时写入那里。然后以标准用户身份运行的应用程序本身可以读取,但从不尝试写入。

另一种方法是让安装程序创建一个 C:\ProgramData 的子文件夹,该文件夹是安全的,以允许标准用户或开发人员认为合适的任何用户/组的写访问权限。

如果您的程序“以管理员身份运行”权限,那么您应该能够避免此问题。

于 2015-04-21T16:01:58.893 回答