我正在制作一个程序,该程序以递归方式列出某个目录中的所有文件,并使用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);
答案 0 :(得分:6)
LPCWSTR
is Microsoft's obfuscation of the const wchar_t*
type和filesystem
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
);
}