CreateFile()成功但文件不在磁盘上。

时间:2014-12-10 12:41:34

标签: c 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);

操作成功但我在磁盘上找不到'filename'。 CreateFile()是否实际在磁盘上创建文件?

2 个答案:

答案 0 :(得分:1)

我尝试了一个只包含你的代码的最小程序......文件是在当前目录中正确创建的!但只有在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;
}

如果我在_T周围没有"filename"宏的UNICODE模式下编译,程序会创建一个文件,但它的名字只是垃圾

答案 1 :(得分:0)

没有太多信息,但这是一个盲目猜测:您的文件被重定向到VirtualStore。

某些位置,例如&#34; Program Files&#34;,在最新版本的Windows上受到保护。 如果您的程序位于受保护的位置且未以管理员身份运行,则读/写操作将重定向到C:\ Users \ MYNAME \ AppData \ Local \ VirtualStore \ MYFOLDER。 以管理员身份运行您的程序应该在任何位置进行更正。