0

我有以下代码从函数中获取文件名,然后将其传递给 createFile(扩展为 createFileA)。较早的一个问题告诉我使用 file.c_str() 将文件名转换为 createFileA 使用的 LPCTSTR。但是,这不起作用,因为每次调用 createFileA 时文件的句柄都无效。我究竟做错了什么?

string file = getFilename();
HANDLE hf = CreateFile(file.c_str(),GENERIC_READ | GENERIC_WRITE,(DWORD) 0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
   {
     MessageBox( hwnd,"CreateFile","Error", MB_OK);
   }
4

3 回答 3

2

如果它编译,那么 .c_str() 必须是正确的类型!

ERROR_INVALID_NAME 的最常见原因是文件名中的非法字符、额外的“:”或制表符,或者您使用的是保留的文件名。检查文件名的值

于 2012-06-01T17:12:22.077 回答
0

根据对问题的评论,问题是您提供的名称包含:. 此字符对于 Windows 中的文件名是非法的,并且是问题的根源。删除该字符,代码应该可以正常工作

于 2012-06-01T17:13:05.240 回答
0

我刚刚注意到,如果您使用以下代码

std::stringstream ss;ss << "C:\文件名.txt" <

然后执行 ss.str() 以获取 std::string。然后如果你做 c_str() 传递给 CreateFile

这不适用于 CreateFile 并且很难跟踪根本原因,但它是“endl;”,它被流式传输到缓冲区中,因此路径将无效

总会报错123 文件名无效

宽版本也会发生这种情况。

于 2013-04-05T15:31:07.237 回答