使用 std::filesystem 输出作为 LPCWSTR
Using std::filesystem output as 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
is Microsoft's obfuscation of the const wchar_t*
type, and filesystem
paths conveniently have a wstring()
member function。您可能还记得,C++ 字符串也允许您通过 c_str()
.
访问它们的字符缓冲区
所以,entry.path().filename().wstring().c_str()
是一个 LPCWSTR
你可以使用(呃!)。小心立即使用它,或者将 wstring()
的结果存储在某个地方,只要你需要 LPCWSTR
生存,因为 wstring()
returns 按值而你不不需要悬挂指针。
// 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
);
}
我正在制作一个程序,它递归地列出特定目录中的所有文件,并使用 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
is Microsoft's obfuscation of the const wchar_t*
type, and filesystem
paths conveniently have a wstring()
member function。您可能还记得,C++ 字符串也允许您通过 c_str()
.
所以,entry.path().filename().wstring().c_str()
是一个 LPCWSTR
你可以使用(呃!)。小心立即使用它,或者将 wstring()
的结果存储在某个地方,只要你需要 LPCWSTR
生存,因为 wstring()
returns 按值而你不不需要悬挂指针。
// 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
);
}