2010-05-29 45 views
0

我正在使用下面的代码从Windows中的文件夹中读取文件。但是,因为这是一个MFC应用程序,我必须将char数组转换为UNICODE。例如,如果我将路径硬编码为“C:\ images3 \ test \”,如下所示代码工作。将字符数组转换为MFC中的UNICODE C++


WIN32_FIND_DATA FindFileData; 
HANDLE hFind = INVALID_HANDLE_VALUE; 
hFind = FindFirstFile(_T("C:\\images3\\test\\"), &FindFileData); 

我要的是得到这个工作如下:


char* pathOfFileType; 
hFind = FindFirstFile(_T(pathOfFileType), &FindFileData); 

谁能告诉我如何解决这个问题?
感谢

回答

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

你也可以使用CString来进行转换,它提供了几种方便的转换功能,并且如果你使用MFC(或ATL),通常建议使用它。 – 2010-05-29 23:19:04

0

可以使用MultiByteToWideChar函数将字符串从char秒值进行转换为UTF-16,但你最好采用Unicode从用户或直接拿到pathOfFileType无论你把它,否则,你还可以遇到包含当前CP中未包含的字符的路径问题。

0

“因为这是一个MFC应用程序,我的字符数组转换为Unicode”

并非如此。如果您愿意,可以使用更改来使用多字节字符集。

在项目属性,一般变化特征设置为“使用多字节字符集”

现在,这将工作

char* pathOfFileType; 
hFind = FindFirstFile(pathOfFileType, &FindFileData); 

假如你希望使用Unicode(Visual Studio的名字为2个字节本机到Windows UNICODE字符)的编码,那么你必须显式调用API的版本MBCS

char* pathOfFileType; 
hFind = FindFirstFileA(pathOfFileType, &FindFileData); 
+0

-1使用多字节字符集_does not_ imply UTF-8。这意味着使用用户为非Unicode程序的代码页设置的任何代码页。 – 2010-05-29 14:43:43

+0

@Logan Capaldo好点。编辑回答让WINAPI看后转换 – ravenspoint 2010-05-29 22:45:48

+0

-1删除。这只是一个更好的词,以前危险不准确。 – 2010-05-30 00:15:16

0

你的问题表明的困惑几个问题。首先,使用MFC并不意味着你必须将字符数组转换为Unicode,而与另一个无关。此外,FindFirstFile是一个Win32 API,而不是MFC函数。最后,_T("abc")不一定是unicode,而是_T(X)是一个宏,它在多字节版本中扩展为x,并且在unicode版本中扩展为L x,创建宽字符文字。这样设计是为了让你的代码能够以unciode或者多字节配置进行编译。为了在声明变量时实现相同的灵活性,可以使用TCHAR类型而不是charwchar_t。所以,你的第二个片段应该像

TCHAR* pathOfFileType; 
hFind = FindFirstFile(pathOfFileType, &FindFileData); 

注意没有_T宏,即仅适用于字符串常量,不是标识符。