CreateFile() завершается успешно, но файла нет на диске.

HANDLE hFile = CreateFile(LPCTSTR("filename"),          // name of the write
                          GENERIC_READ | GENERIC_WRITE,          // open for writing and reading 
                          0,                                     // do not share
                          NULL,                                  // default security
                          OPEN_ALWAYS,                           // create new file only
                          FILE_ATTRIBUTE_NORMAL,                 // normal file
                          NULL); 
if(hFile != INVALID_HANDLE_VALUE)
{
            printf("Success.\n");
}

CloseHandle(hFile);

Операция прошла успешно, но я не могу найти «имя файла» на диске. Действительно ли CreateFile() создает файл на диске?


person Sanich    schedule 10.12.2014    source источник
comment
Посмотрите в текущем каталоге вашего процесса :) файл будет там   -  person Shmil The Cat    schedule 10.12.2014
comment
@ShmilTheCat - Нет. Его там нет :)   -  person Sanich    schedule 10.12.2014
comment
... или в любом другом каталоге, который вы cwd()'или   -  person Peter Miehle    schedule 10.12.2014
comment
просмотрел весь жесткий диск. не вижу   -  person Sanich    schedule 10.12.2014
comment
может ваша операционная система не создает пустые файлы? вы можете попробовать поставить fwrite() перед закрытием   -  person Peter Miehle    schedule 10.12.2014
comment
@PeterMiehle - Собственно, это мой вопрос :) Если CreateFile сам создает файл на диске (перед записью)?   -  person Sanich    schedule 10.12.2014
comment
@PeterMiehl - я пытался записать некоторые данные в файл - и все еще не могу их увидеть.   -  person Sanich    schedule 10.12.2014
comment
Попробуйте добавить путь перед именем файла, например. c:\filename. Это поможет найти его. Распечатка GetLastError после CreateFile может помочь выявить проблемы с указанием. Используемый путь может относиться к компилятору, если вы работаете из среды.   -  person Steen    schedule 10.12.2014


Ответы (2)


Я попробовал минимальную программу, содержащую только ваш код, и... файл был правильно создан в текущем каталоге! Но только если программа скомпилирована в режиме ANSI, потому что LPCTSTR только преобразует указатель в LPCTSTR, но не преобразует из ANSI в UNICODE. Это делает только макрос _T.

Вы должны использовать GetCurrentDirectory для управления тем, где вы пытаетесь записать файл, и использовать TCHAR для совместимости с UNICODE:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

int main() {
    LPTSTR dir;
    DWORD cr = ::GetCurrentDirectory(0, NULL);
    cr += 1;
    dir = (LPTSTR) malloc(cr * sizeof(TCHAR));
    cr = ::GetCurrentDirectory(cr, dir);

    /* ::MessageBox(NULL, dir, _T("Current dir"), MB_OK); */
    _tprintf(_T("Current dir : %s\n"), dir); // note the _tprintf and _T macro
    free(dir);

HANDLE hFile = CreateFile(_T("filename"),          // name of the write - _T
                          GENERIC_READ | GENERIC_WRITE,          // open for writing and reading 
                          0,                                     // do not share
                          NULL,                                  // default security
                          OPEN_ALWAYS,                           // create new file only
                          FILE_ATTRIBUTE_NORMAL,                 // normal file
                          NULL); 
if(hFile != INVALID_HANDLE_VALUE)
{
            printf("Success.\n");
}

CloseHandle(hFile);
return 0;
}

Если я компилирую в режиме UNICODE без макроса _T вокруг "filename", программа создает файл, но его имя просто мусор

person Serge Ballesta    schedule 10.12.2014

Информации не так много, но вот предположение вслепую: ваш файл перенаправляется в VirtualStore.

Некоторые папки, например «Program Files», защищены в последних версиях Windows. Если ваша программа находится в защищенном месте и не запущена от имени администратора, операции чтения/записи будут перенаправлены в C:\Users\MYNAME\AppData\Local\VirtualStore\MYFOLDER. Запуск вашей программы от имени администратора должен исправить это, где бы он ни находился.

person ElderBug    schedule 10.12.2014