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()是否实际在磁盘上创建文件?
答案 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。 以管理员身份运行您的程序应该在任何位置进行更正。