2013-12-10 63 views
0

为了开发一个Windows桌面应用程序,它需要知道每个用户的几个用户目录,我想保存例如用户的文档目录。使用C++获取目录根

我发现已经存在一些宏(例如CSIDL_COMMON_DOCUMENTS)知道它的目录的文件夹,但是当我打印这些信息时,我只是得到一个整数并且不知道如何得到一个字符串。

任何帮助将受到欢迎。

非常感谢!

+0

[可能的答案](http://stackoverflow.com/questions/8610787/how-to-get-the-path-to-csidl-common-documents-in-net-3-5): – ryrich

+0

什么版本的Windows是你的目标? – Alan

+0

那么目标是W7和W8 – user3009804

回答

-2

使用WinAPI的,CSIDL_COMMON_DOCUMENTS是:

  1. 已过时
  2. 不正确的文件夹(这是常见的文档,而不是特定用户的文档文件夹)。

MSFT建议使用KNOWNFOLDERID代替CSIDL_COMMON_DOCUMENTS,但它在Windows Vista之前不受支持。

如果您正在构建Windows应用程序,请考虑使用C++/CLI和.NET库,这使得像访问用户文件夹这样的“窗户”事物非常简单。

using namespace System; 
int main() 
{ 
    Console::WriteLine(); 
    Console::WriteLine("GetFolderPath: {0}", Environment::GetFolderPath(Environment::SpecialFolder::MyDocuments)); 
} 

MSDN Documentation on Environment::SpecialFolder

+0

下投票是因为? – Alan

+1

没有downvote,但问题主要是从CSIDL_COMMON_DOCUMENTS常量和它的朋友那里得到一个字符串,而你的答案没有解决这个问题。 – SirDarius

+0

这个问题用winapi标签标记。提问者也没有要求替代方案。 –

4

您可以使用SHGetFolderPath()

#include <iostream> 
#include <Windows.h> 
#include <Shlobj.h> 

int main() 
{ 
    char path[MAX_PATH]; 
    if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_DOCUMENTS, NULL, 0, path))) 
    { 
     std::cout << path; 
    } 
} 

替换CSIDL_COMMON_DOCUMENTS您所需要的任何CSIDL,如CSIDL_MYDOCUMENTS。要获取其他用户的文档文件夹,您的应用必须先模拟该用户或以其他方式获取该用户的访问令牌,然后才能查询特定于该用户的任何CSIDL值。

+0

SHGetFolderPath已弃用。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx – Alan

+1

@Alan:但仍然正常工作。微软并不习惯于删除弃用的API。 –

+0

这似乎是一个令人讨厌的错误。 – Alan