使用 std::文件系统输出作为 LPCWSTR

Using std::filesystem output as LPCWSTR

本文关键字:LPCWSTR 文件系统 std 使用 输出      更新时间:2023-10-16

我正在制作一个程序,该程序递归列出某个目录中的所有文件,并使用WinINet将每个文件分别上传到FTP服务器。我遇到的问题是在 FtpPutFile() 函数中使用 filesystem::p ath::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::p ath"到"LPCWSTR"的合适转换函数

编辑:这是一个

对我有用的解决方案,通过以下轻盈解决方案:

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

LPCWSTR是Microsoft对const wchar_t*类型的混淆,filesystem路径方便地具有wstring()成员函数。您可能还记得,C++字符串也允许您通过 c_str() 访问其字符缓冲区。

所以,entry.path().filename().wstring().c_str()是您可以使用的LPCWSTR(呃!请注意立即使用它,或者只要您需要LPCWSTR生存,就可以将wstring()的结果存储在某个地方,因为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
    );
}