ofstream не работает на Windows 7 скрытый файл - PullRequest
5 голосов
/ 30 июня 2011

Я понимаю, что 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_NORMAL, ofstream будет успешно открыт.

Я не запускаю программу от имени администратора. Но я использую следующий параметр компоновщика.

linker options

Необходимость включить Нет для Включить контроль учетных записей (UAC) важно, если мы не запустим приложение от имени администратора. ОС поможет нам записать актуальный файл в C:\Users\yccheok\AppData\Local\VirtualStore\a.txt вместо защищенного C:\

Сбой ofstream в скрытом файле Windows 7, это ожидаемое поведение?

1 Ответ

3 голосов
/ 30 июня 2011

Да.Как отмечено в базовой CreateFile документации , "если указаны CREATE_ALWAYS и FILE_ATTRIBUTE_NORMAL, CreateFile завершается ошибкой и устанавливает последнюю ошибку на ERROR_ACCESS_DENIED, если файл существует и имеет FILE_ATTRIBUTE_HIDDEN или FILE_ATTRIBUTE_SYSTEM атрибут. "

Или более читабельный: CreateFile завершается неудачно, если указаны оба CREATE_ALWAYS и FILE_ATTRIBUTE_NORMAL, и если файл имеет атрибут FILE_ATTRIBUTE_HIDDEN и / или FILE_ATTRIBUTE_SYSTEM.

Так уж случилось, что ofstream звонит CreateFile вот так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...