使用std :: filesystem输出作为LPCWSTR

时间:2019-01-02 13:43:01

标签: c++ windows visual-studio-2017 wininet

我正在制作一个程序,该程序以递归方式列出某个目录中的所有文件,并使用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);

我得到的错误是: 从“ 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);

1 个答案:

答案 0 :(得分:6)

LPCWSTR is Microsoft's obfuscation of the const wchar_t* typefilesystem paths conveniently have a wstring() member function。您可能还记得,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
    );
}