Использование вывода std :: filesystem в качестве LPCWSTR - PullRequest
0 голосов
/ 02 января 2019

Я делаю программу, которая рекурсивно перечисляет все файлы в определенном каталоге и загружает каждый файл отдельно на FTP-сервер, используя WinINet.Проблема, с которой я сталкиваюсь, заключается в использовании filesystem :: path :: filename в функции FtpPutFile (), потому что необходим LPCWSTR.Какой самый лучший и самый простой способ преобразовать его (или как-то использовать его как есть)?

    std::string path = "C:\\Programs";
    for (const auto & entry : std::experimental::filesystem::recursive_directory_iterator(path))
        FtpPutFile(hIConnect, entry.path().filename(), entry.path().filename(), FTP_TRANSFER_TYPE_BINARY, 0);

Я получаю ошибку: нет подходящей функции преобразования из "const std :: экспериментальный :: filesystem :: v1:: path "to" LPCWSTR "существует

РЕДАКТИРОВАТЬ: Вот решение, которое работало для меня, следуя решению Lightness:

    std::string path = "C:\\Programs";
    for (const auto & entry : std::experimental::filesystem::recursive_directory_iterator(path))
        FtpPutFile(hIConnect, entry.path().wstring().c_str(), entry.path().filename().wstring().c_str(), FTP_TRANSFER_TYPE_BINARY, 0);

1 Ответ

0 голосов
/ 02 января 2019

LPCWSTR - это обфускация Microsoft путей const wchar_t* типа , а filesystem обычно имеют функцию-члена wstring() .Как вы помните, строки C ++ также предоставляют вам доступ к их символьному буферу через c_str().

Так что entry.path().filename().wstring().c_str() - это LPCWSTR, который вы можете использовать (тьфу!).Будьте осторожны, чтобы использовать это немедленно, или храните результат wstring() где-то столько, сколько вам нужно, чтобы LPCWSTR выжил, потому что wstring() возвращается по значению, и вам не нужен свисающий указатель.

// Untested, but a logical adaptation of your code
const std::string path = "C:\\Programs";
std::experimental::filesystem::recursive_directory_iterator it(path);
for (const auto& entry : it)
{
    const std::wstring filename = entry.path().filename().wstring();

    FtpPutFile(
       hIConnect,
       filename.c_str(),
       filename.c_str(),
       FTP_TRANSFER_TYPE_BINARY,
       0
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...