我一直致力于使用FindFirstFile和FindNextFile来反向搜索目录,但我遇到了一个我不明白的问题。
以下是代码段。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine
,int nCmdShow)
{
searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf");
return 0;
}
bool searchDrive(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
{
TCHAR szFullPattern[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFile = INVALID_HANDLE_VALUE;
PathCombine(szFullPattern, lpFolder, L"x");
MessageBox(NULL,szFullPattern,lpFilePattern,MB_ICONWARNING |
MB_CANCELTRYCONTINUE |
MB_DEFBUTTON2);
HANDLE hFind = FindFirstFile(szFullPattern, &FindFileData);
我正在使用Visual Studio 2008。
你可以看到除了最后一个角色以外的所有角色和' \'无法看到,其余的都出现在亚洲人物中。
(注意不要担心我的代码有任何其他问题。)
任何关于为什么会发生这种情况的想法都会受到赞赏。
答案 0 :(得分:4)
这是你的问题:
searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf");
默认情况下,Visual Studio以Unicode模式编译程序。因此,您将两个“ANSI”(8位字符)字符串都转换为“Unicode”(16位字符)字符串类型。
这不会转换字符串。它只是告诉编译器假装它们一直是Unicode字符串。毫无疑问,这不起作用;结果是每对ANSI字符都被视为一个Unicode字符。
你可以解决这个问题:
searchDrive(TEXT("C:\\"), TEXT("*.bdjf"));
但除非您有特定理由支持ANSI模式,否则最好还是使用
searchDrive(L"C:\\", L"*.bdjf");
并将searchDrive
的声明更改为使用LPCWSTR
而不是LPCTSTR
。
答案 1 :(得分:1)
更改此行:
searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf");
对此:
searchDrive(L"C:\\", L"*.bdjf");
您也可以说TEXT("C:\\")
和TEXT("*.bdjf")
进行相应的字符串文字转换。
但总的来说,你应该停止使用TCHAR
,只使用Unicode和长字符串。
答案 2 :(得分:0)
请删除您不知道完全您正在做什么的所有演员阵容,并解释为什么演员阵容必要正确工作。永远不要扼杀编译器,而是要求它说出来:使用-Wall -Wextra
,并适当地处理所有警告。
这样做会使错误显而易见。