区分大小写的文件重命名不起作用

时间:2015-04-21 15:20:16

标签: c visual-studio-2010 case-sensitive programdata

在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;
}

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

仅供参考,使用cygwin gcc 4.8.3编译时程序运行正常。

1 个答案:

答案 0 :(得分:1)

C:\ProgramData具有阻止标准用户在那里写作的安全设置。这在Windows 8中并不新,Windows 7是相同的,Vista上的等效文件夹也以这种方式受到保护。也许您的Windows 7 UAC环境未被禁用,或者您已经保护C:\ProgramDataC:\ProgramData\MyProgramName以允许对标准用户的写访问权。

有些事情,你必须了解UAC

当Microsoft引入UAC时,他们需要一种方法让旧应用程序继续工作,至少在一段时间内。他们提出的是“文件和注册表虚拟化”,其中试图访问(现在 - ) verboten 系统文件夹或注册表项的旧应用程序将被重定向到他们自己的用户特定“虚拟化”副本这些资源。正如关于UAC的维基百科文章。

说实话, ProgramData包含非用户特定的应用程序数据。此数据将可供计算机上的所有用户使用。

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

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

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