fopen незаметно завершает работу при создании файлов на системном диске (C: \) - PullRequest
5 голосов
/ 18 января 2011

Всякий раз, когда я пытаюсь создать файл с использованием 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 , файл создается в% APPDATA% из-за виртуализация . Кто-нибудь знает, как отключить эту функцию?

Ответы [ 3 ]

6 голосов
/ 18 января 2011

Это может быть связано с виртуальным магазином.Взгляните здесь для получения дополнительной информации.

3 голосов
/ 18 января 2011

Если вы буквально запускаете код, который вы разместили, то вы вообще не запрашиваете файл в корневом каталоге.Вам нужно вместо этого ввести "c:\\filename.txt" (два символа '\').Возможно, если вы посмотрите в текущем каталоге, то обнаружите, что успешно создали файл со странным именем (в основном <formfeed>ilename.txt, я думаю).

2 голосов
/ 19 января 2011

У нас была похожая проблема с виртуализацией реестра, да, она также виртуализируется после Vista.

Нашим решением было Свойства-> Компоновщик-> Файл манифеста-> Уровень выполнения UAC-> requireAdministrator .ИМХО, это может сработать и для вашего случая.

...