Разобрать строку в LPCWSTR

Я работаю с boost-файловой системой для поиска всех файлов по конкретному пути. Я также хочу получить данные о создании этого файла, его последнем открытии и последнем обновлении, поэтому, поскольку я работаю в Windows, мне нужно использовать GetFileTime (для которого требуется HANDLE, который я буду получить с помощью функции CreateFile.

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

строка filename = "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-> путь (). строка ());

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;
}

person user3009804    schedule 17.12.2013    source источник
comment
string скорее будет LPCSTR, wstring будет LPCWSTR - это смесь UNICODE и ANSI. Лучше быть последовательным.   -  person Roger Rowland    schedule 17.12.2013
comment
Почему вы не используете wchar_t * fileName = C: \ Users \ MyUSer \ Desktop \ PDN.pdf?   -  person Ravi Shenoy    schedule 17.12.2013


Ответы (4)


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

person Pavel Zhuravlev    schedule 17.12.2013
comment
Большое спасибо, я использовал этот способ и отлично работает :) - person user3009804; 17.12.2013

Самое простое решение:

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);
person utnapistim    schedule 17.12.2013
comment
большое спасибо! это работает, но в конце концов я использовал другой метод. Но работает действительно хорошо :) - person user3009804; 17.12.2013

Для этого используйте 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);
person Sergey Podobry    schedule 17.12.2013

Я знаю, что уже поздно, но я использую этот метод для преобразования строки в 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;
}
person Willi    schedule 03.11.2015
comment
возврат того, что нужно удалить = плохая практика. - person Michael Chourdakis; 20.12.2018