【问题标题】:ofstream doesn't work on Windows 7 hidden fileofstream 不适用于 Windows 7 隐藏文件
【发布时间】:2011-06-30 05:39:26
【问题描述】:

我意识到ofstream 不适用于 Windows 7 隐藏文件。

这是快速测试代码。

#include <fstream>
#include <iostream>
#include <tchar.h>
#include <windows.h>

int main() {    
    {
        std::ifstream file2(_T("c:\\a.txt"));
        if (file2.is_open()) {
            std::cout << "ifstream open" << std::endl;
        } else {
            std::cout << "ifstream not open!" << std::endl;
        }
    }

    // SetFileAttributes(_T("c:\\a.txt"), FILE_ATTRIBUTE_NORMAL);
    SetFileAttributes(_T("c:\\a.txt"), FILE_ATTRIBUTE_HIDDEN);

    {
        std::ofstream file(_T("c:\\a.txt"));
        if (file.is_open()) {
            std::cout << "ofstream open" << std::endl;
        } else {
            std::cout << "ofstream not open!" << std::endl;
        }
    }
    getchar();
}

这是我得到的输出

ifstream open
ofstream not open!

如果我使用FILE_ATTRIBUTE_NORMALofstream会成功打开。

我没有以管理员身份运行程序。但是,我确实使用了以下链接器选项。

如果我们不以管理员身份启动应用程序,则必须为 启用用户帐户控制 (UAC) 设置,这一点很重要。操作系统将帮助我们将实际文件写入C:\Users\yccheok\AppData\Local\VirtualStore\a.txt 而不是受保护的C:\

ofstream 在 Windows 7 隐藏文件上是否失败,这是预期的行为吗?

【问题讨论】:

  • 当您说您使用“以下链接器选项”时,您指的是这七个链接器选项中的哪一个?为什么您认为提及这一点很重要?虚拟商店真的与这个问题相关吗?
  • 我更新了信息,以帮助您了解为什么拒绝 UAC 很重要。
  • 您是否尝试在打开ofstream 之前关闭ifstream
  • 我曾尝试在打开 ofstream 之前明确关闭 ifstream。它的行为仍然相同。
  • 将文件写入 C 根目录以外的位置。UAC 对 C 根目录进行特殊处理。看看行为是否以更普通的方式持续存在。

标签: c++ windows-7


【解决方案1】:

是的。如基础CreateFile documentation 中所述,“如果指定了CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL,则CreateFile 失败并将最后一个错误设置为ERROR_ACCESS_DENIED(如果文件存在并且具有FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEM 属性)。 "

或者更具可读性:如果同时指定了CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL,并且文件具有FILE_ATTRIBUTE_HIDDEN 和/或FILE_ATTRIBUTE_SYSTEM 属性,则CreateFile 失败。

恰巧ofstream 像这样调用CreateFile

【讨论】:

  • 但奇怪的是,您上面引用的文档是为“Windows Server 2003 和 Windows XP/2000”指定的。但是我只在Windows 7遇到这个问题。我在Windows XP中没有遇到这个问题。
  • 我认为问题仅存在于 Windows 7 中。我做进一步的测试。它似乎也在 Windows XP 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多