CreateFile()总是失败

时间:2013-09-10 07:28:30

标签: c windows string winapi unicode

char    tempFilename[256];
wchar_t filename[512];

fprintf(stdout, "Please enter file name/path: \n");
getchar();
fgets(tempFilename, 255, stdin);

MultiByteToWideChar(CP_ACP, 0, tempFilename, -1, filename, strlen(tempFilename)*2);

if((hReadFile = CreateFile(filename, GENERIC_READ , 0, 0, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE)
{
    fprintf(stdout, "File could not be opened, make sure name is under 256 chars. Error Code - %d.\n", GetLastError());
    return (0);
}

我已经检查过MultiByteToWideChar()成功了。

事实上,我也试过像C:\ users \ user_name \ desktop \ test.txt这样的路径而不是C:\ users \ user_name \ desktop \ test.txt

我使用以下内容将\转换为\\ <\ p>

while(temp < len )
{
    filename1[cntr1] = tempFilename[temp];
    cntr1 += 1;
    if(tempFilename[temp] == '\\')
    {
        filename1[cntr1] = '\\';
        cntr1 += 1;
    }
    temp += 1;
}

这个工作直到\到\\。 我哪里错了..?

1 个答案:

答案 0 :(得分:4)

在尝试使用之前打印filename。十分之九,这样的简单调试输出将向您显示确切的问题。

然后使用分隔符打印出来,以便您可以看到是否有换行符:

printf ("[%s]\n", filename);

(或等效的方法,例如使用wprintf)。

如果有换行符,您会看到:

[myfile.txt
]

而不是:

[myfile.txt]

如果你得到一个字符串,你想要删除换行符,你可以使用类似的东西:

int slen = strlen (filename);
if ((slen > 0) && (filename[slen-1] == '\n'))
    filename[slen-1] = '\0';

(再次,或等效,例如使用wcslen)。

另一方面,如果输入来自用户,则不需要将\替换为\\。转义仅在C源代码本身中需要。

而且,最后一件事,我不是完全确定你在getchar()之前调用fgets()的原因 - 你很可能会失去第一个角色你正在输入。