Obtention de l’ID d’un dossier

Avant de pouvoir utiliser un objet d’espace de noms, vous avez besoin d’un moyen de l’identifier. Cela signifie obtenir son pointeur vers une liste d’identificateur d’élément (PIDL) ou, dans le cas d’objets de système de fichiers, son chemin d’accès. Cette section décrit deux des façons les plus simples d’obtenir des ID d’objet.

Pour une approche plus puissante qui fonctionne avec n’importe quel dossier, utilisez l’interface IShellFolder . Pour plus d’informations, consultez Obtention d’informations sur le contenu d’un dossier .

Boîte de dialogue OpenFiles

Pour permettre à l’utilisateur de naviguer dans l’espace de noms et de sélectionner un dossier, votre application peut utiliser l’interface IFileDialog . L’appel de cette interface avec l’indicateur FOS_PICKFOLDERS lance la boîte de dialogue Ouvrir des fichiers en mode « sélectionner des dossiers ».

Pour Windows Vista et versions ultérieures, il s’agit de la méthode recommandée pour sélectionner des dossiers.

Boîte de dialogue SHBrowseForFolder

Pour permettre à l’utilisateur de naviguer dans l’espace de noms et de sélectionner un dossier, votre application peut simplement appeler SHBrowseForFolder. L’appel de cette fonction lance une boîte de dialogue avec une interface utilisateur qui fonctionne un peu comme les boîtes de dialogue courantes Ouvrir ou Enregistrer.

Lorsque l’utilisateur sélectionne un dossier, SHBrowseForFolder retourne le PIDL complet du dossier et son nom d’affichage. Si le dossier se trouve dans le système de fichiers, l’application peut convertir le PIDL en chemin d’accès en appelant SHGetPathFromIDList. L’application peut également restreindre la plage de dossiers que l’utilisateur peut sélectionner en spécifiant un dossier racine. Seuls les dossiers qui se trouvent en dessous de cette racine dans l’espace de noms s’affichent. L’illustration suivante montre la boîte de dialogue SHBrowseForFolder , avec le dossier racine défini sur Program Files.

capture d’écran de la boîte de dialogue Rechercher un dossier

Un exemple simple d’utilisation de SHBrowseForFolder est fourni ultérieurement.

Dossiers spéciaux et CSIDL

Un certain nombre de dossiers couramment utilisés sont désignés comme spéciaux par le système. Ces dossiers ont un objectif bien défini, et la plupart d’entre eux sont présents sur tous les systèmes. Même s’ils ne sont pas présents initialement, leurs noms et leurs emplacements sont toujours définis, de sorte qu’ils peuvent être ajoutés ultérieurement. La collection de dossiers spéciaux inclut tous les dossiers virtuels standard du système, tels que les imprimantes, mes documents et le voisinage réseau. Il comprend également un certain nombre de dossiers de système de fichiers standard, tels que Program Files et System.

Même si les dossiers sont un composant standard de tous les systèmes, leurs noms et emplacements dans l’espace de noms peuvent varier. Par exemple, le répertoire système est C:\Winnt\System32 sur certains systèmes et C:\Windows\System32 sur d’autres. Dans le passé, les variables d’environnement fournissaient un moyen de déterminer le nom et l’emplacement d’un dossier spécial sur un système particulier. L’interpréteur de commandes offre désormais un moyen plus robuste et flexible d’identifier les dossiers spéciaux, les CSIDL. Vous devez généralement les utiliser au lieu de variables d’environnement.

Les CSIDL fournissent un moyen uniforme d’identifier et de localiser des dossiers spéciaux, quel que soit leur nom ou leur emplacement sur un système particulier. Contrairement aux variables d’environnement, les CSIDL peuvent être utilisés avec des dossiers virtuels ainsi que des dossiers de système de fichiers. Un CSIDL unique est affecté à chaque dossier spécial. Par exemple, le dossier système de fichiers Program Files a un CSIDL de CSIDL_PROGRAM_FILES, et le dossier virtuel Network Neighborhood a un CSIDL de CSIDL_NETWORK.

Un CSIDL est utilisé conjointement avec l’une des fonctions shell pour récupérer le PIDL d’un dossier spécial ou le chemin d’accès d’un dossier de système de fichiers spécial. Si le dossier n’existe pas sur un système, votre application peut le forcer à être créé en combinant son CSIDL avec CSIDL_FLAG_CREATE. Le CSIDL peut être passé aux fonctions suivantes :

  • SHGetFolderLocation, qui récupère le PIDL d’un dossier spécial.
  • SHGetFolderPath, qui récupère le chemin d’accès d’un dossier spécial du système de fichiers.

Notez que ces deux fonctions ont été introduites avec la version 5.0 de l’interpréteur de commandes et remplacent les fonctions SHGetSpecialFolderLocation et SHGetSpecialFolderPath .

Exemple simple d’utilisation des CSIDL et SHBrowseForFolder

L’exemple de fonction suivant, PidlBrowse, montre comment utiliser des CSIDL pour récupérer le PIDL d’un dossier et utiliser SHBrowseForFolder pour que l’utilisateur sélectionne un dossier. Il retourne le PIDL et le nom d’affichage du dossier sélectionné.

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

L’application appelante passe dans un handle de fenêtre, qui est nécessaire par SHBrowseForFolder. Le paramètre nCSIDL est un CSIDL facultatif utilisé pour spécifier un dossier racine. Seuls les dossiers situés sous le dossier racine de la hiérarchie s’affichent. L’illustration illustrée précédemment a été générée en appelant cette fonction avec nCSIDL défini sur CSIDL_PROGRAM_FILES. L’application appelante transmet également une mémoire tampon de chaîne, pszDisplayName, pour contenir le nom d’affichage du dossier sélectionné lorsque PidlBrowse retourne. Il incombe à l’application appelante de libérer l’IDList renvoyée par SHBrowseForFolder à l’aide de CoTaskMemFree.