Sdílet prostřednictvím


Získání ID složky

Než budete moct použít objekt oboru názvů, potřebujete způsob, jak ho identifikovat. To znamená získání ukazatele na seznam identifikátorů položky (PIDL) nebo v případě objektů systému souborů jeho cestu. Tato část popisuje dva z jednodušších způsobů získání ID objektů.

Pro výkonnější přístup, který bude fungovat s libovolnou složkou, použijte rozhraní IShellFolder. Další podrobnosti najdete v tématu Získání informací o obsahu složky.

Dialogové okno OpenFiles

Pokud chcete uživateli povolit navigaci v oboru názvů a výběru složky, může vaše aplikace použít rozhraní IFileDialog. Volání tohoto rozhraní pomocí příznaku FOS_PICKFOLDERS spustí Otevřít soubory běžné dialogové okno v režimu "výběr složek".

Pro Windows Vista a novější je to doporučený způsob, jak vybrat složky.

Dialogové okno SHBrowseForFolder

Pro povolení uživateli navigovat v prostoru názvů a vybrat složku může vaše aplikace jednoduše vyvolat SHBrowseForFolder. Volání této funkce spustí dialogové okno s uživatelským rozhraním, které funguje podobně jako Otevřít nebo Uložit jako běžná dialogová okna.

Když uživatel vybere složku, SHBrowseForFolder vrátí plně kvalifikovaný PIDL složky a jeho zobrazovaný název. Pokud je složka v systému souborů, aplikace může převést PIDL na cestu voláním SHGetPathFromIDList. Aplikace může také omezit rozsah složek, ze které si uživatel může vybrat zadáním kořenové složky. Zobrazí se pouze složky, které jsou pod tímto kořenem v oboru názvů. Následující obrázek ukazuje dialogové okno SHBrowseForFolder s kořenovou složkou nastavenou na Program Files.

snímek obrazovky dialogového okna pro vyhledání složky

Jednoduchý příklad použití SHBrowseForFolder je k dispozici později.

Speciální složky a seznamy CSID

Řada běžně používaných složek je systémem označena jako speciální. Tyto složky mají dobře definovaný účel a většina z nich se nachází ve všech systémech. I když nejsou na začátku přítomny, jejich názvy a umístění jsou stále definovány, takže je můžete přidat později. Kolekce speciálních složek zahrnuje všechny standardní virtuální složky systému, jako jsou tiskárny, dokumenty a síťová čtvrť. Obsahuje také řadu standardních složek systému souborů, jako jsou Program Files a System.

I když jsou složky standardní součástí všech systémů, jejich názvy a umístění v oboru názvů se mohou lišit. Například systémový adresář je C:\Winnt\System32 v některých systémech a C:\Windows\System32 na jiných. Proměnné prostředí v minulosti poskytovaly způsob, jak určit název a umístění speciální složky v jakémkoli konkrétním systému. Prostředí nyní poskytuje robustnější a flexibilnější způsob identifikace speciálních adresářů CSIDL . Obecně byste je měli používat místo proměnných prostředí.

Seznamy CSID poskytují jednotný způsob identifikace a umístění zvláštních složek bez ohledu na jejich název nebo umístění v určitém systému. Na rozdíl od proměnných prostředí lze CSIDLs použít s virtuálními složkami i složkami systému souborů. Každá speciální složka má přiřazený jedinečný identifikátor CSIDL. Například složka systému souborů Program Files má CSIDL CSIDL_PROGRAM_FILESa virtuální složka Sousedství sítě má CSIDL CSIDL_NETWORK.

CSIDL se používá ve spojení s jednou z několika funkcí prostředí k načtení speciální složky PIDL nebo cesty ke speciální složce systému souborů. Pokud složka v systému neexistuje, aplikace může vynutit její vytvoření kombinací jejího CSIDL s CSIDL_FLAG_CREATE. CSIDL lze předat následujícím funkcím:

Všimněte si, že tyto dvě funkce byly zavedeny ve verzi 5.0 shellu a nahrazují funkce SHGetSpecialFolderLocation a SHGetSpecialFolderPath.

Jednoduchý příklad použití CSIDLs a SHBrowseForFolder

Následující ukázková funkce PidlBrowse ukazuje, jak pomocí CSIDLs načíst PIDL složky a použít SHBrowseForFolder k tomu, aby uživatel vybral složku. Vrátí PIDL a zobrazovaný název vybrané složky.

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;
}

Volající aplikace předá popisovač okna, který je potřeba pro SHBrowseForFolder. Parametr nCSIDL je volitelný identifikátor CSIDL, který slouží k určení kořenové složky. Zobrazí se pouze složky pod kořenovou složkou v hierarchii. Obrázek zobrazený dříve byl generován voláním této funkce s nCSIDL nastavenou na CSIDL_PROGRAM_FILES. Volající aplikace také předává do řetězcového bufferu, pszDisplayName, pro uchování zobrazovaného názvu vybrané složky, když PidlBrowse vrátí hodnotu. Je zodpovědností volající aplikace uvolnit IDList, který vrací SHBrowseForFolder, pomocí CoTaskMemFree.