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); 
+0

不要使用类似'memcpy()'的东西建立文件路径字符串。改用'PathCombine()'来代替。并且'GetCurrentDirectory()'不保证报告EXE所在的文件夹。使用'GetModuleFileName()'来代替文件名,例如'PathRemoveFileSpec()'。 –

您不能null终止字符串。在第二次致电memcpy时通过strlen(name) + 1来完成。

其他一些意见:

  • CreateFile失败,你应该叫GetLastError获得一个错误代码。
  • 使用字符串时,使用strcpystrcat而不是memcpy
  • 也就是说,你的代码要求溢出缓冲区。如果这真的是C++,请使用std::string并让该类管理缓冲区。
  • 没有真正的理由相信可执行文件位于当前工作目录中。