【问题标题】:Using std::filesystem output as LPCWSTR使用 std::filesystem 输出作为 LPCWSTR
【发布时间】:2019-05-29 03:58:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 为我工作!但是你介意解释一下“小心”部分吗?
    • @Apex 当然 - 已添加
    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2021-08-21
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多