2010-03-10 75 views
10

從Visual C++中,如何獲取當前用戶的「我的文檔」文件夾的路徑?獲取「我的文檔」的路徑

編輯:

我有這樣的:

TCHAR my_documents[MAX_PATH]; 
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents); 

然而,result是回來與E_INVALIDARG值。任何想法,爲什麼這可能是?

回答

14

這取決於您需要與系統兼容多久。對於舊系統,有SHGetSpecialFolderPath。對於較新的系統,有SHGetFolderPath。從Vista開始,有SHGetKnownFolderPath

編輯:你想用CSIDL_PERSONAL而不是CSIDL_MYDOCUMENTS。這樣的作品,至少在我的機器上演示代碼:

#include <windows.h> 
#include <iostream> 
#include <shlobj.h> 

#pragma comment(lib, "shell32.lib") 

int main() { 
    CHAR my_documents[MAX_PATH]; 
    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents); 

    if (result != S_OK) 
     std::cout << "Error: " << result << "\n"; 
    else 
     std::cout << "Path: " << my_documents << "\n"; 
    return 0; 
} 
+0

謝謝 - 我已經試過SHGetFolderPath,並且有些東西不太合適 - 你會介意看看我在編輯中的問題嗎? – Smashery 2010-03-10 06:28:49

+0

非常感謝! – Smashery 2010-03-10 23:17:04

+0

這似乎是一個蟒蛇內置現在。 http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo 2012-06-27 08:33:35

8

使用the SHGetFolderPath Windows API function和請求CSIDL_MYDOCUMENTS

+0

我認爲這個鏈接不正確,修復:http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx – uray 2010-03-10 06:02:07

+0

謝謝 - 我已經試過了,有些東西不是很完美工作 - 你會介意看看我在編輯中的問題嗎? – Smashery 2010-03-10 06:27:54

1

注意的是,如果用戶在Win7的文檔庫更改默認保存文件夾CSIDL_PERSONAL不會返回所需的文件夾。要獲取正確的文件夾,需要使用SHLoadLibraryFromKnownFolder獲取文檔庫的IShellLibrary,使用IShellLibrary::GetDefaultSaveFolder獲取庫的默認保存文件夾的IShellItem,最後使用IShellItem::GetDisplayName獲取文件夾名稱。

1
std::string GetSystemFolderPaths(int csidl) 
{ 
    wchar_t Folder[1024]; 
    HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, Folder); 
    if (SUCCEEDED(hr)) 
    { 
     char str[1024]; 
     wcstombs(str, Folder, 1023); 
     return str; 
    } 
    else return ""; 
} 

cout<<GetSystemFolderPaths(CSIDL_MYDOCUMENTS)<<endl; 

這個解決方案怎麼樣?它爲我工作很好。

+0

看來您沒有使用csidl參數。如果我理解的很好,可能應該把它作爲SHGetFolderPathW()而不是CSIDL_MYDOCUMENTS的第二個參數。 – BrunoLevy 2015-12-16 17:53:03