c++ - 使用 std::filesystem 输出作为 LPCWSTR
问题描述
我正在制作一个程序,它递归地列出某个目录中的所有文件,并使用 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);
解决方案
LPCWSTR
是微软对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
);
}
推荐阅读
- r - 使用 R 中的 cut() 函数将日期转换为 15 分钟间隔的不可预测的结果
- sql - 插入..在重复键更新时重复值
- matlab - 梯度下降后向量 Theta 无符号
- javascript - 2020 年 AJAX 最佳实践(成功与完成)
- android - 在干净架构的上下文中,用例和交互器意味着什么?
- linux - 在现代 Linux x86-64 中,用户空间覆盖 GS 寄存器是否安全?
- python - 了解 Pytorch 网格示例
- javascript - Invalid CORS request
- android - something problem on alertdialog flutter, you can help me?
- r - 如何在列表中命名数据框