CreateFile返回无效句柄值
问题描述:
我试图从exe文件所在的目录中读取文件。 data.txt文件在VS Project目录中,当我指定完整路径时,一切正常。CreateFile返回无效句柄值
char curDirectory[MAX_PATH];
GetCurrentDirectory(MAX_PATH, curDirectory);
char filePath[MAX_PATH];
char *name = "\\data.txt";
memcpy(filePath, curDirectory, sizeof(curDirectory));
memcpy(filePath + strlen(curDirectory), name, strlen(name));
HANDLE hFile = CreateFile(filePath, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
答
您不能null终止字符串。在第二次致电memcpy
时通过strlen(name) + 1
来完成。
其他一些意见:
- 当
CreateFile
失败,你应该叫GetLastError
获得一个错误代码。 - 使用字符串时,使用
strcpy
和strcat
而不是memcpy
。 - 也就是说,你的代码要求溢出缓冲区。如果这真的是C++,请使用
std::string
并让该类管理缓冲区。 - 没有真正的理由相信可执行文件位于当前工作目录中。
不要使用类似'memcpy()'的东西建立文件路径字符串。改用'PathCombine()'来代替。并且'GetCurrentDirectory()'不保证报告EXE所在的文件夹。使用'GetModuleFileName()'来代替文件名,例如'PathRemoveFileSpec()'。 –