我使用以下函数尝试获取文档文件夹的路径,然后将该路径转换为std :: string:
std::string getpath() {
TCHAR documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents);
std::stringstream pff;
pff << result;
return pff.str();
}
执行此操作时,我收到&#34;无效的文件名错误&#34;当试图追加&#34; \ filename&#34;到了字符串。
请帮忙!
编辑:以下是我追加路径的方式:
std::string folder = getpath() + "\\Folder";
我认为双逃生符号仍然适用。
答案 0 :(得分:1)
您不打印documents
,而是result
。
尝试这样的事情:
std::string getpath() {
TCHAR documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents);
if (result == S_OK) // SUCCEEDED(result) can be problematic
// since S_FALSE is a possible return value
{
std::stringstream pff;
pff << documents;
return pff.str();
}
// handle error somehow
return "";
}
这是一个支持Unicode的版本:
std::wstring getpath() {
TCHAR documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents);
if (result == S_OK) // SUCCEEDED(result) can be problematic
// since S_FALSE is a possible return value
{
std::wstringstream pff;
pff << documents;
return pff.str();
}
// handle error somehow
return L"";
}
答案 1 :(得分:1)
您的代码失败,因为您实际上正在构建SHGetFolderPath的返回值(即错误代码)之外的字符串。您应该使用返回的路径。
由于不推荐declare @i bigint
set @i=25
select @i+getdate()
select cast ( @i+getdate() as int)
,您应该使用SHGetKnownFolderPath。除此之外,您不会意外地构造MBCS编码的路径名。并且没有任意42658
(260)字符限制。
以下代码检索当前用户的文档路径 1 :
SHGetFolderPath
注意:MAX_PATH
未正式记录,因此在未来版本的编译器中可能无法使用。具有类似功能的自定义实现可能如下所示:
#include <string>
#include <ShlObj.h>
#include <comdef.h>
std::wstring GetDocumentPath() {
wchar_t* pOut = nullptr;
// Retrieve document path (CheckError throws a _com_error exception on failure)
_com_util::CheckError( ::SHGetKnownFolderPath( FOLDERID_Documents, KF_FLAG_DEFAULT,
nullptr, &pOut ) );
// Attach returned buffer to a smart pointer with custom deleter. This
// is necessary, because the std::wstring c'tor throws on failure.
// Without this smart pointer, any exception would leak memory.
auto deleter = []( void* p ) { ::CoTaskMemFree( p ); };
std::unique_ptr<wchar_t, decltype( deleter )> buffer{ pOut, deleter };
return std::wstring{ buffer.get() };
// Invisible: Run deleter for buffer, cleaning up allocated resources.
}
记录_com_raise_error会引发_com_error异常。 FAILED宏也会被记录下来。
<小时/> 1 已知的文件夹路径是可自定义的(请参阅Folder Redirection Overview)。你不能简单地尝试自己构建它们。您必须向Shell索取此信息。
答案 2 :(得分:-2)
我最终抛弃了SHGetFolderPath,并采用了更直截了当的_dupenv_s:
std::string getpath() {
char* buf = 0;
size_t sz = 0;
if (_dupenv_s(&buf, &sz, "USERPROFILE") == 0) {
std::string path(buf);
path += "\\Documents\\Folder";
return path;
}
return NULL;
}