ofstream不适用于Windows 7隐藏文件

时间:2011-06-30 05:39:26

标签: c++ windows-7

我意识到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将成功打开。

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

linker options

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

{7}在Windows 7隐藏文件中失败,是预期的行为吗?

1 个答案:

答案 0 :(得分:3)

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

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

恰好,ofstream会像这样调用CreateFile