2013-12-17 4 views
3

Я работаю с файловой системой boost, чтобы искать все файлы в конкретном пути. Я также хочу, чтобы получить данные создания этого файла, последнее открытие и последнее обновление так, как я работаю в Windows, мне нужно использовать GetFileTime (который требует РУЧКУ, что я буду получать с помощью функции CreateFile.Parse string to LPCWSTR

Дело в том, что при помощи бустерного файловой системы я получаю строку, как показано

строка имя_файла = "C: \ Users \ MyUser \ Desktop \ PDN.pdf";

, и мне нужно преобразовать эту строку в LPCWSTR.

Из-за этого я сделал несколько попыток, которые потерпели неудачу, например:

HANDLE hFile = CreateFile((LPCWSTR)fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); 

Но при этом, он преуспел:

HANDLE hFile = CreateFile(L"C:\\Users\\MyUSer\\Desktop\\PDN.pdf", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); 

Так что мой вопрос, как я мог проанализировать строку в PWSTR с помощью строковой переменной? И если возможно (я думаю, нет), есть ли какая-либо функция, которая изменит исходный путь, добавив косую черту, где обнаружит другую косую черту?

Большое спасибо

Редакцией: Это так, как я сделал это после того, что я прочитал здесь:

wstring fileFullPathWstring = winAPII.stringToWstring (iter-> путь() .String());

HANDLE hFile = CreateFile (fileFullPathWstring.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

Использование функции:

wstring WinAPIIteraction::stringToWstring(string stringName){ 
    int len; 
    int slength = (int)stringName.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, stringName.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, stringName.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 
+0

'string', скорее всего, будет' LPCSTR', '' wstring' является LPCWSTR' - это смесь UNICODE и ANSI. Лучше быть последовательным. –

+0

Почему вы не используете wchar_t * fileName = "C: \\ Users \\ MyUSer \\ Desktop \\ PDN.pdf"? –

ответ

5

Вы можете использовать MultibyteToWideChar() функцию для выполнения фактического преобразования (MSDN page). Нет необходимости добавлять косые черты - это просто escape-последовательности, которые представляют собой один код '\' в коде программы.

+0

Большое спасибо, я использовал этот способ и отлично работает :) – user3009804

1

Простейшее решение:

wstring filename="C:\Users\MyUser\Desktop\PDN.pdf"; 
HANDLE hFile = CreateFile(
    fileName.c_str(), // std::wstring::c_str returns wchar_t* 
    GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); 
+0

большое спасибо! он работает, но, наконец, я использовал другой метод. Но он работает очень хорошо :) – user3009804

1

Использование CA2W из ATL для этого:

string filename="C:\Users\MyUser\Desktop\PDN.pdf"; 
HANDLE hFile = CreateFile(CA2W(fileName.c_str()), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); 
0

Я знаю, что подмигнули поздно, но это метод я использую, чтобы преобразовать строку в LPCWSTR:

typedef long long long64; 
/**Don´t forget to use delete*/ 
LPCWSTR convStringToLPCWSTR(string String) 
{ 
    char *cString = &String[0u]; 
    long64 size = strlen(cString); 
    wchar_t* wString = new wchar_t[size]; 
    for (long64 i = 0; i < size; i++) 
    { 
     wString[i] = cString[i]; 
    } 
    wString[size] = 0; //important, otherwise Windows will print whatever next in memmory until it finds a zero. 
    return wString; 
}