Udostępnij przez


Pobieranie identyfikatora folderu

Aby można było użyć obiektu przestrzeni nazw, należy go zidentyfikować. Oznacza to uzyskanie wskaźnika do listy identyfikatorów elementów (PIDL) lub, w przypadku obiektów systemu plików, jego ścieżki. W tej sekcji omówiono dwa prostsze sposoby uzyskiwania identyfikatorów obiektów.

W przypadku bardziej zaawansowanego podejścia, które będzie działać z dowolnym folderem, użyj interfejsu IShellFolder. Aby uzyskać więcej informacji, zobacz Uzyskiwanie informacji o zawartości folderu.

Okno dialogowe OpenFiles

Aby umożliwić użytkownikowi nawigowanie po przestrzeni nazw i wybranie folderu, aplikacja może użyć interfejsuIFileDialog. Wywołanie tego interfejsu za pomocą flagi FOS_PICKFOLDERS powoduje uruchomienie zwykłego okna dialogowego Otwórz pliki w trybie wybierania folderów.

W przypadku systemu Windows Vista i nowszych jest to zalecany sposób wybierania folderów.

Okno dialogowe SHBrowseForFolder

Aby umożliwić użytkownikowi nawigowanie po przestrzeni nazw i wybranie folderu, aplikacja może po prostu wywołać SHBrowseForFolder. Wywołanie tej funkcji uruchamia okno dialogowe z interfejsem użytkownika, które działa w sposób zbliżony do typowych okien dialogowych Otwórz lub ZapiszAs.

Gdy użytkownik wybierze folder, SHBrowseForFolder zwraca w pełni kwalifikowaną nazwę PIDL folderu i jego nazwę wyświetlaną. Jeśli folder znajduje się w systemie plików, aplikacja może przekonwertować kod PIDL na ścieżkę, wywołując SHGetPathFromIDList. Aplikacja może również ograniczyć zakres folderów, z których użytkownik może wybrać, określając folder główny. Wyświetlą się jedynie foldery znajdujące się pod tym katalogiem głównym w przestrzeni nazw. Poniższa ilustracja przedstawia okno dialogowe SHBrowseForFolder z folderem głównym ustawionym na Program Files.

zrzut ekranu okna dialogowego przeglądania folderu

Prosty przykład użycia SHBrowseForFolder zostanie udostępniony później.

Foldery specjalne i CSIDLs

Wiele często używanych folderów jest oznaczonych jako specjalne przez system. Te foldery mają dobrze zdefiniowany cel, a większość z nich znajduje się we wszystkich systemach. Nawet jeśli nie są one obecne początkowo, ich nazwy i lokalizacje są nadal zdefiniowane, więc można je dodać później. Kolekcja folderów specjalnych obejmuje wszystkie standardowe foldery wirtualne systemu, takie jak Drukarki, Moje dokumenty i Sąsiedztwo sieci. Zawiera również wiele standardowych folderów systemu plików, takich jak Program Files i System.

Mimo że foldery są standardowym składnikiem wszystkich systemów, ich nazwy i lokalizacje w przestrzeni nazw mogą się różnić. Na przykład katalog System to C:\Winnt\System32 w niektórych systemach i C:\Windows\System32 w innych. W przeszłości zmienne środowiskowe udostępniały sposób określania nazwy i lokalizacji folderu specjalnego w dowolnym systemie. Powłoka zapewnia teraz bardziej niezawodny i elastyczny sposób identyfikowania folderów specjalnych, CSIDLs. Zazwyczaj należy ich używać zamiast zmiennych środowiskowych.

CsIDLs zapewniają jednolity sposób identyfikowania i lokalizowania folderów specjalnych, niezależnie od ich nazwy lub lokalizacji w określonym systemie. W przeciwieństwie do zmiennych środowiskowych, csIDLs mogą być używane z folderami wirtualnymi, a także folderami systemu plików. Każdy folder specjalny ma przypisany unikatowy identyfikator CSIDL. Na przykład folder systemu plików Program Files ma CSIDL CSIDL_PROGRAM_FILES, a wirtualny folder Otoczenie sieciowe ma CSIDL CSIDL_NETWORK.

Plik CSIDL jest używany w połączeniu z jedną z kilku funkcji powłoki w celu pobrania pliku PIDL folderu specjalnego lub ścieżki specjalnego folderu systemu plików. Jeśli folder nie istnieje w systemie, aplikacja może wymusić jego utworzenie, łącząc jego CSIDL z CSIDL_FLAG_CREATE. Plik CSIDL można przekazać do następujących funkcji:

Należy pamiętać, że te dwie funkcje zostały wprowadzone w wersji 5.0 Shell i zastępują funkcje SHGetSpecialFolderLocation i SHGetSpecialFolderPath.

Przykład jak używać CSIDLs i SHBrowseForFolder

Poniższa przykładowa funkcja, PidlBrowse, ilustruje, jak używać CSIDLs do pobierania PIDL folderu oraz jak używać SHBrowseForFolder, aby użytkownik mógł wybrać folder. Zwraca on nazwę PIDL i nazwę wyświetlaną wybranego folderu.

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

Aplikacja wywołująca przekazuje uchwyt okna, który jest wymagany przez SHBrowseForFolder. Parametr nCSIDL jest opcjonalnym plikiem CSIDL używanym do określania folderu głównego. Zostaną wyświetlone tylko foldery poniżej folderu głównego w hierarchii. Ilustracja pokazana wcześniej została wygenerowana przez wywołanie tej funkcji za pomocą nCSIDL ustawionej na CSIDL_PROGRAM_FILES. Aplikacja wywołująca przekazuje również bufor ciągu, pszDisplayName, w celu przechowywania nazwy wyświetlanej wybranego folderu, gdy funkcja PidlBrowse zwraca. Obowiązkiem aplikacji wywołującej jest zwalnianie listy IDList zwróconej przez SHBrowseForFolder przy użyciu CoTaskMemFree.