我正在使用以下代码从Windows中的文件夹中读取文件。但是,由于这是一个MFC应用程序,我必须将char数组转换为UNICODE。例如,如果我将路径硬编码为“C:\ images3 \ test \”,如下所示,代码可以工作。
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
hFind = FindFirstFile(_T("C:\\images3\\test\\"), &FindFileData);
我想要的是如下工作:
char* pathOfFileType;
hFind = FindFirstFile(_T(pathOfFileType), &FindFileData);
有人能告诉我如何解决这个问题吗? 感谢
答案 0 :(得分:1)
非常感谢您的所有回复。我从这些答案中学到了很多东西,因为我也对下面发生的事情一无所知。与此同时,我设法通过使用以下代码转换为UNICODE来解决问题,而对现有代码的更改最少。
#include <atlconv.h>
USES_CONVERSION;
//An ANSI string
LPSTR lpsz_ANSI_String = pathOfFileType;
//ANSI string being converted to a UNICODE string
LPWSTR lpUnicodeStr = A2W( lpsz_ANSI_String );
hFind = FindFirstFile(lpUnicodeStr, &FindFileData);
答案 1 :(得分:0)
您可以使用MultiByteToWideChar函数将字符串从char
转换为UTF-16,但您最好直接从用户或从任何地方以Unicode的形式获取pathOfFileType
你接受它,否则你可能仍然会遇到包含当前CP中未包含的字符的路径的问题。
答案 2 :(得分:0)
“因为这个MFC应用程序我 将char数组转换为UNICODE”
不是这样。如果您愿意,可以使用更改来使用多字节字符集。
在项目属性中,常规更改字符集设置为“使用多字节字符集”
现在这将有效
char* pathOfFileType;
hFind = FindFirstFile(pathOfFileType, &FindFileData);
假设您要使用UNICODE(Visual Studio的名称用于Windows原生的UNICODE字符的2字节编码),那么您必须显式调用API的MBCS版本
char* pathOfFileType;
hFind = FindFirstFileA(pathOfFileType, &FindFileData);
答案 3 :(得分:0)
您的问题表明了几个问题的混乱。首先,使用MFC并不意味着你必须将字符数组转换为Unicode,一个与另一个无关。此外,FindFirstFile
是Win32 API,而不是MFC函数。最后,_T("abc")
不一定是unicode,而_T(X)
是一个宏,在多字节构建中扩展为 X ,在unicode构建中扩展为L X < / em>,创建一个宽字符文字。这样设计使您的代码可以在unciode或多字节配置中进行编译。要在声明变量时获得相同的灵活性,请使用TCHAR
类型而不是char
或wchar_t
。所以你的第二个片段看起来应该是
TCHAR* pathOfFileType;
hFind = FindFirstFile(pathOfFileType, &FindFileData);
注意没有_T
宏,它只适用于字符串文字,而不是标识符。