使用std :: filesystem输出作为LPCWSTR

Ape*_*pex 1 c++ windows wininet visual-studio-2017

我正在制作一个程序,以递归方式列出某个目录中的所有文件,并使用WinINet将每个文件分别上传到FTP服务器.我遇到的问题是在FtpPutFile()函数中使用filesystem :: path :: filename,因为需要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);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:没有合适的转换函数从"const std :: experimental :: filesystem :: v1 :: path"到"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);
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 7

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
    );
}
Run Code Online (Sandbox Code Playgroud)