views:

201

answers:

4

I'm using the folowing code to read files from a folder in windows. However since this a MFC application I have to convert the char array to UNICODE. For example if I hard code the path as "C:\images3\test\" as shown below the code works.


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

What I want is to get this working as follows:


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

Can anyone tell me how to fix this problem ?
Thanks

A: 

You can use the MultiByteToWideChar function to convert a string from chars to UTF-16, but you'd better to get pathOfFileType directly in Unicode from the user or from wherever you take it, otherwise you may still experience problems with paths that contain characters not included in the current CP.

Matteo Italia
A: 

"since this a MFC application I have to convert the char array to UNICODE"

Not so. If you wish, you can use change to use the Multi-Byte Character Set.

In project properties, general change character set to 'Use Multi-Byte Character Set'

Now this will work

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

Supposing you want to use UNICODE ( visual studio's name for the 2 byte encoding of UNICODE characters native to Windows ) then you have to explicitly call the MBCS version of the API

char* pathOfFileType;  
hFind = FindFirstFileA(pathOfFileType, &FindFileData);
ravenspoint
-1 Use multi-byte character set _does not_ imply UTF-8. It means use whatever codepage the user has set for their codepage for non-Unicode programs.
Logan Capaldo
@Logan Capaldo Good point. Edited answer to let WINAPI look after conversion
ravenspoint
-1 removed. It was just for like a better word, dangerously inaccurate before.
Logan Capaldo
A: 

Your question demonstrates a confusion of several issues. First, using MFC doesn't mean you have to convert the character array to Unicode, one has nothing to do with the other. Furthermore, FindFirstFile is a Win32 API, not an MFC function. Finaly, _T("abc") is not necessarily unicode, rather _T(X) is a macro that in multi-byte builds expands to X, and in unicode builds expands to L X, creating a wide character literal. This is designed so that your code can compile in a unciode or multi-byte configuration. To achieve the same flexibility when declaring a variable, you use the TCHAR type instead of char or wchar_t. So your second snippet should look like

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

Note no _T macro, that is only applied to string literals, not identifiers.

Logan Capaldo
A: 

Thanks a lot for all your responses. I learnt a lot from those answers because I also didn't have much idea about what is happening underneath. Meanwhile I managed to get rid of the issue by simply converting to UNICODE using the following code with minimum changes to my existing code.

#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); 
chathuradd
you can also use CString to do the conversion, it provides several convenient conversion functions and is generally recommended to use if you are using MFC (or ATL for that matter).
Anders K.