ofstream不适用于Windows 7隐藏文件

Che*_*eng 6 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();
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出

ifstream open
ofstream not open!
Run Code Online (Sandbox Code Playgroud)

如果我使用FILE_ATTRIBUTE_NORMAL,ofstream将成功打开.

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

链接器选项

说完就转用于启用用户帐户控制(UAC)是很重要的,如果我们不启动应用程序作为管理员.操作系统将帮助我们将实际文件写入C:\Users\yccheok\AppData\Local\VirtualStore\a.txt而不是受保护C:\

是否ofstream在Windows 7无法隐藏的文件,是预期的行为?

MSa*_*ers 4

是的。正如底层CreateFile文档中所述,“如果指定了CREATE_ALWAYS和,则失败,并将最后一个错误设置为文件存在且具有or属性。”FILE_ATTRIBUTE_NORMALCreateFileERROR_ACCESS_DENIEDFILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEM

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

恰巧有这样的ofstream调用。CreateFile