共用方式為


取得資料夾的識別碼

您必須先找出命名空間物件,才能使用命名空間物件。 這表示取得其指向專案識別碼清單的指標, (PIDL) ,或在檔案系統物件的情況下取得其路徑。 本節討論取得物件識別碼的兩種較簡單方式。

如需將處理任何資料夾的更強大方法,請使用 IShellFolder 介面。 如需詳細資訊 ,請參閱取得資料夾內容的相關資訊

OpenFiles 對話方塊

若要讓使用者流覽命名空間並選取資料夾,您的應用程式可以使用 IFileDialog 介面。 使用 FOS_PICKFOLDERS 旗標呼叫此介面會以「挑選資料夾」模式啟動 [開啟檔案 ] 通用對話方塊。

針對 Windows Vista 和更新版本,這是挑選資料夾的建議方式。

SHBrowseForFolder 對話方塊

若要讓使用者流覽命名空間並選取資料夾,您的應用程式可以直接叫用 SHBrowseForFolder。 呼叫此函式會啟動具有 UI 的對話方塊,其運作方式與 [開啟] 或 [另 存新檔] 一般對話方塊類似。

當使用者選取資料夾時, SHBrowseForFolder 會傳回資料夾的完整 PIDL 及其顯示名稱。 如果資料夾位於檔案系統中,應用程式可以呼叫 SHGetPathFromIDList,將 PIDL 轉換成路徑。 應用程式也可以藉由指定根資料夾來限制使用者可以選取的資料夾範圍。 只有命名空間中根目錄下方的資料夾才會出現。 下圖顯示 [SHBrowseForFolder ] 對話方塊,並將根資料夾設定為 Program Files。

流覽資料夾對話方塊的螢幕擷取畫面

稍後會提供如何使用 SHBrowseForFolder 的簡單範例。

特殊資料夾和 CSIDL

系統指定了一些常用的資料夾。 這些資料夾具有妥善定義的用途,而且大部分資料夾都存在於所有系統上。 即使它們一開始不存在,仍會定義其名稱和位置,以便稍後新增它們。 特殊資料夾的集合包含所有系統的標準虛擬資料夾,例如印表機、我的檔和網路鄰近地區。 它也包含許多標準檔系統資料夾,例如 Program Files and System。

雖然資料夾是所有系統的標準元件,但其命名空間中的名稱和位置可能會有所不同。 例如,某些系統上的系統目錄為 C:\Winnt\System32,而其他系統則是 C:\Windows\System32。 在過去,環境變數提供了一種方式來判斷任何特定系統上特殊資料夾的名稱和位置。 Shell 現在提供更強固且彈性的方式,以識別特殊資料夾、 CSIDL。 您通常應該使用它們,而不是環境變數。

CSIDL 提供一致的識別和尋找特殊資料夾的方式,不論其名稱或位置為何。 不同于環境變數,CSIDL 可以搭配虛擬資料夾和檔系統資料夾使用。 每個特殊資料夾都有一個指派給它的唯一 CSIDL。 例如,Program Files 檔系統資料夾的 CSIDL 為 CSIDL_PROGRAM_FILES,而 [網路鄰近區] 虛擬資料夾的 CSIDL 為 CSIDL_NETWORK

CSIDL 會與數個 Shell 函式的其中一個搭配使用,以擷取特殊資料夾的 PIDL 或特殊檔系統資料夾的路徑。 如果資料夾不存在於系統上,您的應用程式可以藉由將其 CSIDL 與 CSIDL_FLAG_CREATE結合來強制建立它。 CSIDL 可以傳遞至下列函式:

請注意,這兩個函式是使用 Shell 5.0 版引進,並取代 SHGetSpecialFolderLocationSHGetSpecialFolderPath 函 式。

如何使用 CSIDLs 和 SHBrowseForFolder 的簡單範例

下列範例函式 PidlBrowse 說明如何使用 CSIDL 來擷取資料夾的 PIDL,並使用 SHBrowseForFolder 讓使用者選取資料夾。 它會傳回所選取資料夾的 PIDL 和顯示名稱。

LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
{
    LPITEMIDLIST pidlRoot = NULL;
    LPITEMIDLIST pidlSelected = NULL;
    BROWSEINFO bi = {0};

    if(nCSIDL)
    {
        SHGetFolderLocation(hwnd, nCSIDL, NULL, NULL, &pidlRoot);
    }

    else
    {
        pidlRoot = NULL;
    }

    bi.hwndOwner = hwnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = pszDisplayName;
    bi.lpszTitle = "Choose a folder";
    bi.ulFlags = 0;
    bi.lpfn = NULL;
    bi.lParam = 0;

    pidlSelected = SHBrowseForFolder(&bi);

    if(pidlRoot)
    {
        CoTaskMemFree(pidlRoot);
    }

    return pidlSelected;
}

呼叫的應用程式會傳入視窗控制碼, SHBrowseForFolder需要此控制碼。 nCSIDL參數是選擇性 CSIDL,用來指定根資料夾。 只會顯示階層中根資料夾下方的資料夾。 稍早所示的圖例是呼叫此函式,並將nCSIDL設定為CSIDL_PROGRAM_FILES。 呼叫的應用程式也會傳入字串緩衝區 pszDisplayName,以在 PidlBrowse 傳回時保存所選資料夾的顯示名稱。 呼叫應用程式的責任是使用CoTaskMemFree釋放SHBrowseForFolder所傳回的 IDList。