【问题标题】:fopen fails invisibly when creating files in system drive (C:\)fopen 在系统驱动器 (C:\) 中创建文件时不可见地失败
【发布时间】:2011-01-18 20:22:15
【问题描述】:

每当我尝试使用 fopen 创建文件时,fopen 的行为就好像该文件已正确打开并且具有对其的完全访问权限,但它实际上并没有创建该文件。我的程序没有对系统根文件夹的写入权限,因为它需要管理员权限才能在那里写入,但为什么 fopen() 没有给出任何错误?

知道如何判断是否有错误吗?当我尝试在受保护的目录中打开文件时返回的文件句柄与我在具有写访问权限的目录中打开文件时完全相同。

我已经尝试过使用各种不同版本的 fopen(fopen、_wfopen、_wfopen_s),但它们都有相同的输出。

有趣的是,GetLastError() 返回 ERROR_ALREADY_EXISTS。

这是我正在使用的代码:

FILE *FileHandle; 
DWORD error = _wfopen_s(&FileHandle, L"\\filename.txt", L"a");
Win32Error = GetLastError();

if (error != 0 || FileHandle == NULL)
{
    //Throw error
}
else 
{
    //write to file
    //close file
}

编辑:正如rerun 指出的那样,由于virtualization,文件正在%APPDATA% 中创建。有谁知道如何禁用此功能?

【问题讨论】:

    标签: c++ c windows fopen


    【解决方案1】:

    这可能与虚拟商店有关。看看here 了解一些信息。

    【讨论】:

    • 哇,是的,这就是日志结束的地方,谢谢!知道如何让 fopen 抛出错误吗?
    【解决方案2】:

    如果您实际上是在运行您发布的代码,那么您根本不会要求根目录中的文件。您需要改用"c:\\filename.txt"(两个“\”字符)。也许如果您查看当前目录,您会发现您已经成功创建了一个名称奇怪的文件(我认为基本上是 <formfeed>ilename.txt)。

    【讨论】:

    • 不,这是我的问题中的一个错字。我刚刚用我的实际代码更新了它。谢谢
    【解决方案3】:

    我们在注册表虚拟化中遇到了类似的问题,是的,它在 Vista 之后也被虚拟化了。

    我们的解决方案是Properties->Linker->Manifest File->UAC Execution Level->requireAdministrator。恕我直言,它也可能适用于您的情况。

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多