Share via


Obtención del identificador de una carpeta

Para poder usar un objeto de espacio de nombres, necesita una manera de identificarlo. Esto significa obtener su puntero a una lista de identificadores de elemento (PIDL) o, en el caso de los objetos del sistema de archivos, su ruta de acceso. En esta sección se describen dos de las formas más sencillas de obtener identificadores de objeto.

Para obtener un enfoque más eficaz que funcione con cualquier carpeta, use la interfaz IShellFolder . Vea Obtener información sobre el contenido de una carpeta para obtener más detalles.

Cuadro de diálogo OpenFiles

Para permitir que el usuario navegue por el espacio de nombres y seleccione una carpeta, la aplicación puede usar la interfaz IFileDialog . Al llamar a esta interfaz con la marca FOS_PICKFOLDERS , se inicia el cuadro de diálogo Común Abrir archivos en modo "seleccionar carpetas".

Para Windows Vista y versiones posteriores, esta es la manera recomendada de elegir carpetas.

Cuadro de diálogo SHBrowseForFolder

Para permitir que el usuario navegue por el espacio de nombres y seleccione una carpeta, la aplicación puede simplemente invocar SHBrowseForFolder. Al llamar a esta función, se inicia un cuadro de diálogo con una interfaz de usuario que funciona de forma similar a los cuadros de diálogo comunes Abrir o GuardarAs .

Cuando el usuario selecciona una carpeta, SHBrowseForFolder devuelve el PIDL completo de la carpeta y su nombre para mostrar. Si la carpeta está en el sistema de archivos, la aplicación puede convertir el PIDL en una ruta de acceso llamando a SHGetPathFromIDList. La aplicación también puede restringir el intervalo de carpetas entre las que el usuario puede seleccionar especificando una carpeta raíz. Solo aparecerán las carpetas que están debajo de esa raíz en el espacio de nombres. En la ilustración siguiente se muestra el cuadro de diálogo SHBrowseForFolder , con la carpeta raíz establecida en Archivos de programa.

captura de pantalla del cuadro de diálogo Buscar carpeta

Más adelante se proporciona un ejemplo sencillo de cómo usar SHBrowseForFolder .

Carpetas especiales y CSIDLs

El sistema designa una serie de carpetas usadas habitualmente como especiales . Estas carpetas tienen un propósito bien definido y la mayoría de ellas están presentes en todos los sistemas. Incluso si no están presentes inicialmente, se siguen definiendo sus nombres y ubicaciones, por lo que se pueden agregar más adelante. La colección de carpetas especiales incluye todas las carpetas virtuales estándar del sistema, como Impresoras, Mis documentos y Barrio de red. También incluye una serie de carpetas estándar del sistema de archivos, como Archivos de programa y Sistema.

Aunque las carpetas son un componente estándar de todos los sistemas, sus nombres y ubicaciones en el espacio de nombres pueden variar. Por ejemplo, el directorio System es C:\Winnt\System32 en algunos sistemas y C:\Windows\System32 en otros. En el pasado, las variables de entorno proporcionaron una manera de determinar el nombre y la ubicación de una carpeta especial en cualquier sistema determinado. El Shell ahora proporciona una manera más sólida y flexible de identificar carpetas especiales, CSIDLs. Por lo general, debe usarlos en lugar de variables de entorno.

Los CSIDL proporcionan una manera uniforme de identificar y localizar carpetas especiales, independientemente de su nombre o ubicación en un sistema determinado. A diferencia de las variables de entorno, los CSIDL se pueden usar con carpetas virtuales, así como con carpetas del sistema de archivos. Cada carpeta especial tiene un CSIDL único asignado. Por ejemplo, la carpeta del sistema de archivos de programa tiene un CSIDL de CSIDL_PROGRAM_FILES y la carpeta virtual Network Neighborhood tiene un CSIDL de CSIDL_NETWORK.

Un CSIDL se usa junto con una de varias funciones de Shell para recuperar el PIDL de una carpeta especial o la ruta de acceso de una carpeta del sistema de archivos especial. Si la carpeta no existe en un sistema, la aplicación puede forzar su creación mediante la combinación de su CSIDL con CSIDL_FLAG_CREATE. El CSIDL se puede pasar a las siguientes funciones:

Tenga en cuenta que estas dos funciones se introdujeron con la versión 5.0 del Shell y sustituyen a las funciones SHGetSpecialFolderLocation y SHGetSpecialFolderPath .

Un ejemplo sencillo de cómo usar CSIDLs y SHBrowseForFolder

La siguiente función de ejemplo, PidlBrowse, muestra cómo usar CSIDL para recuperar el PIDL de una carpeta y usar SHBrowseForFolder para que el usuario seleccione una carpeta. Devuelve el PIDL y el nombre para mostrar de la carpeta seleccionada.

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

La aplicación que realiza la llamada pasa un identificador de ventana, que shBrowseForFolder necesita. El parámetro nCSIDL es un CSIDL opcional que se usa para especificar una carpeta raíz. Solo se mostrarán las carpetas situadas debajo de la carpeta raíz de la jerarquía. La ilustración mostrada anteriormente se generó llamando a esta función con nCSIDL establecido en CSIDL_PROGRAM_FILES. La aplicación que realiza la llamada también pasa un búfer de cadenas, pszDisplayName, para contener el nombre para mostrar de la carpeta seleccionada cuando PidlBrowse devuelve. Es responsabilidad de la aplicación que realiza la llamada liberar el IDList devuelto por SHBrowseForFolder mediante CoTaskMemFree.