Administración del sistema de archivos

Shell proporciona varias maneras de administrar sistemas de archivos. Shell proporciona una función , SHFileOperation, que permite a una aplicación mover, copiar, cambiar el nombre y eliminar archivos mediante programación. Shell también admite algunas funcionalidades adicionales de administración de archivos.

  • Los documentos HTML se pueden conectar a archivos relacionados, como archivos gráficos o hojas de estilos. Cuando el documento se mueve o copia, los archivos conectados también se mueven o copian automáticamente.
  • En el caso de los sistemas que están disponibles para más de un usuario, los archivos se pueden administrar por usuario. Los usuarios tienen fácil acceso a sus archivos de datos, pero no a los archivos que pertenecen a otros usuarios.
  • Si se agregan o modifican archivos de documento, se pueden agregar a la lista de documentos recientes del Shell. Cuando el usuario hace clic en el comando Documentos en el menú Inicio, aparece una lista de vínculos a los documentos.

En este documento se describe cómo funcionan estas tecnologías de administración de archivos. A continuación, describe cómo usar shell para mover, copiar, cambiar el nombre y eliminar archivos y cómo administrar objetos en la Papelera de reciclaje.

administración de archivos de Per-User

El Shell de Windows 2000 permite asociar archivos a un usuario determinado para que los archivos permanezcan ocultos de otros usuarios. En términos del sistema de archivos, los archivos se almacenan en la carpeta de perfiles del usuario, normalmente C:\Documents and Settings\Username\ en sistemas Windows 2000. Esta característica permite a muchas personas usar el mismo equipo, a la vez que mantiene la privacidad de sus archivos de otros usuarios. Los distintos usuarios pueden tener diferentes programas disponibles. También proporciona una manera sencilla de que los administradores y las aplicaciones almacenen elementos como la inicialización (.ini) o los archivos de vínculo (.lnk). Por lo tanto, las aplicaciones pueden conservar un estado diferente para cada usuario y recuperar fácilmente ese estado determinado cuando sea necesario. También hay una carpeta de perfil para almacenar información que es común a todos los usuarios.

Dado que no es conveniente determinar qué usuario ha iniciado sesión y dónde se encuentran sus archivos, las carpetas estándar por usuario son carpetas especiales y se identifican mediante un CSIDL. Por ejemplo, el CSIDL de la carpeta Archivos de programa por usuario es CSIDL_PROGRAMS. Si la aplicación llama a SHGetFolderLocation o SHGetFolderPath con uno de los CSIDL por usuario, la función devuelve el puntero a una lista de identificadores de elemento (PIDL) o la ruta de acceso adecuada para el usuario que ha iniciado sesión actualmente. Si la aplicación necesita recuperar la ruta de acceso o PIDL de la carpeta de perfiles, su CSIDL se CSIDL_PROFILE.

Mis documentos y mis carpetas de imágenes

Uno de los iconos estándar que se encuentran en el escritorio es Mis documentos. Al abrir esta carpeta, contiene los archivos de documento del usuario actual. La instancia de escritorio de Mis documentos es una carpeta virtual ( un alias para la ubicación del sistema de archivos que se usa para almacenar físicamente los documentos del usuario) ubicado inmediatamente debajo del escritorio en la jerarquía de espacios de nombres.

El propósito de las carpetas Mis documentos y Mis imágenes es proporcionar una manera sencilla y segura de que los usuarios accedan a sus archivos de documentos y imágenes en un sistema que pueda tener varios usuarios. A cada usuario se le asignan carpetas del sistema de archivos independientes para sus archivos. Por ejemplo, la ubicación de la carpeta de documentos de un usuario en el sistema de archivos suele ser similar a C:\Documents and Settings\username\My Documents. No es necesario que los usuarios sepan nada sobre la ubicación física de sus carpetas del sistema de archivos. Simplemente acceden a sus archivos a través del icono Mis documentos.

Nota

Mis documentos permite a un usuario acceder a sus propios archivos, pero no a los de ningún otro usuario. Si varias personas usan el mismo equipo, un administrador puede bloquear a los usuarios de la parte del sistema de archivos donde se almacenan los archivos reales. Por lo tanto, los usuarios podrán trabajar en sus propios documentos a través de la carpeta Mis documentos, pero no en documentos que pertenezcan a ningún otro usuario.

 

Normalmente no es necesario que una aplicación sepa qué usuario ha iniciado sesión o dónde se encuentra la carpeta Mis documentos del usuario en el sistema de archivos. En su lugar, la aplicación puede recuperar el PIDL del icono de escritorio Mis documentos llamando al método IShellFolder::P arseDisplayName del escritorio. El nombre de análisis usado para identificar la carpeta Mis documentos no es una ruta de acceso de archivo, sino ::{450d8fba-ad25-11d0-98a8-0800361b1103}. La expresión entre corchetes es la forma de texto del GUID mis documentos. Por ejemplo, para recuperar el PIDL de Mis documentos, la aplicación debe usar esta llamada a IShellFolder::P arseDisplayName.

hr = psfDeskTop->ParseDisplayName(NULL, 
                                  NULL, 
                                  L"::{450d8fba-ad25-11d0-98a8-0800361b1103}", 
                                  &chEaten, 
                                  &pidlDocFiles, 
                                  NULL);

Una vez que la aplicación tiene el PIDL Mis documentos, puede controlar la carpeta igual que haría con una carpeta normal del sistema de archivos: enumerar elementos, analizar, enlazar y realizar cualquier otra operación de carpeta válida. Shell asigna automáticamente los cambios en Mis documentos o sus subcarpetas a las carpetas del sistema de archivos adecuadas.

Si la aplicación necesita acceso a la carpeta real del sistema de archivos que contiene los documentos del usuario actual, pase CSIDL_PERSONAL a SHGetFolderLocation. La función devuelve el PIDL de la carpeta del sistema de archivos que se muestra en la carpeta Mis documentos del usuario actual.

Archivos conectados

Los documentos HTML suelen tener varios archivos gráficos asociados, un archivo de hoja de estilos, varios archivos de Microsoft JScript (compatibles con los archivos de especificación del lenguaje ECMA 262), etc. Al mover o copiar el documento HTML principal, normalmente también quiere mover o copiar sus archivos asociados para evitar vínculos importantes. Desafortunadamente, no ha habido ninguna manera fácil hasta ahora de determinar qué archivos están relacionados con cualquier documento HTML determinado que no sea mediante el análisis de su contenido. Para solucionar este problema, Windows 2000 proporciona una manera sencilla de conectar un documento HTML principal a su grupo de archivos asociados. Si la conexión de archivos está habilitada, cuando el documento se mueve o copia todos sus archivos conectados van con él.

Para crear un grupo de archivos conectados, el documento principal debe tener una extensión de nombre de archivo .htm o .html. Cree una subcarpeta de la carpeta primaria del documento principal. El nombre de la subcarpeta debe ser el nombre del documento principal, menos el .htm o la extensión .html, seguido de una de las extensiones que se enumeran a continuación. Las extensiones más usadas son ".files" o "_files". Por ejemplo, si el documento principal se denomina MyDoc.htm, asigna un nombre a la subcarpeta "MyDoc_files" define la subcarpeta como contenedor para los archivos conectados del documento. Si el documento principal se mueve o copia, la subcarpeta y sus archivos también se mueven o copian.

En algunos idiomas, es posible usar un equivalente localizado de "_files" para crear una subcarpeta para archivos conectados. En la tabla siguiente se enumeran las cadenas válidas que se pueden anexar a un nombre de documento para crear una subcarpeta de archivos conectados. Tenga en cuenta que algunas de estas cadenas tienen '-' como primer carácter en lugar de '_' o '.'.

"_archivos"

"_arquivos"

"_bestanden"

"_bylos"

"-Dateien"

"_datoteke"

"_dosyalar"

"_elemei"

"_failid"

"_fails"

"_fajlovi"

"_ficheiros"

"_fichiers"

"-filer"

".files"

"_files"

"_file"

"_fitxers"

"_fitxategiak"

"_pliki"

"_soubory"

"_tiedostot"

 

Nota

Esta característica es sensible al caso de la extensión. Por ejemplo, en el ejemplo anterior, una subcarpeta denominada "MyDoc_Files" no se conectará a MyDoc.htm.

 

Si la conexión de archivos está habilitada o deshabilitada está controlada por un valor de REG_DWORD , NoFileFolderConnection, de la siguiente clave del Registro.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer

Normalmente, este valor no está definido y la conexión de archivos está habilitada. Si es necesario, puede deshabilitar la conexión de archivos agregando este valor a la clave y estableciendolo en 1. Para volver a habilitar la conexión de archivos, establezca NoFileFolderConnection en cero.

Nota

Normalmente, la conexión de archivos debe estar habilitada porque es posible que otras aplicaciones dependan de ella. Deshabilite la conexión de archivos solo si es absolutamente necesario.

 

Mover, copiar, cambiar el nombre y eliminar archivos

El espacio de nombres no es estático y las aplicaciones normalmente necesitan administrar el sistema de archivos realizando una de las siguientes operaciones.

  • Copiar un objeto en otra carpeta.
  • Mover un objeto a otra carpeta.
  • Eliminar un objeto.
  • Cambiar el nombre de un objeto.

Todas estas operaciones se realizan con SHFileOperation. Esta función toma uno o varios archivos de origen y genera los archivos de destino correspondientes. En el caso de la operación de eliminación, el sistema intenta colocar los archivos eliminados en la Papelera de reciclaje.

También es posible mover archivos mediante la funcionalidad de arrastrar y colocar .

Para usar la función , debe rellenar los miembros de una estructura SHFILEOPSTRUCT y pasarla a SHFileOperation. Los miembros clave de la estructura son pFrom y pTo.

El miembro pFrom es una cadena terminada en null doble que contiene uno o varios nombres de archivo de origen. Estos nombres pueden ser rutas de acceso completas o caracteres comodín dos estándar, como *.*. Aunque este miembro se declara como una cadena terminada en null, se usa como búfer para contener varios nombres de archivo. Cada nombre de archivo debe terminar con el carácter NULL único habitual. Se debe anexar un carácter NULL adicional al final del nombre final para indicar el final de pFrom.

El miembro pTo es una cadena terminada en null doble, de forma muy similar a pFrom. El miembro pTo contiene los nombres de uno o varios nombres de destino completos. Se empaquetan en pTo de la misma manera que para pFrom. Si pTo contiene varios nombres, también debe establecer la marca FOF_MULTIDESTFILES en el miembro fFlags . El uso de pTo depende de la operación como se describe aquí.

  • Para las operaciones de copia y movimiento, si todos los archivos van a un único directorio, pTo contiene el nombre completo del directorio. Si los archivos van a destinos diferentes, pTo también puede contener un directorio completo o un nombre de archivo para cada archivo de origen. Si no existe un directorio, el sistema lo crea.
  • Para las operaciones de cambio de nombre, pTo contiene una ruta de acceso completa para cada archivo de origen en pFrom.
  • Para las operaciones de eliminación, no se usa pTo .

Notificación del shell

Notifique al Shell el cambio después de usar SHFileOperation para mover, copiar, cambiar el nombre o eliminar archivos, o después de realizar cualquier otra acción que afecte al espacio de nombres. Las acciones que deben ir acompañadas de una notificación incluyen lo siguiente:

  • Agregar o eliminar archivos o carpetas.
  • Mover, copiar o cambiar el nombre de archivos o carpetas.
  • Cambiar una asociación de archivo.
  • Cambio de atributos de archivo.
  • Agregar o quitar unidades o medios de almacenamiento.
  • Crear o deshabilitar una carpeta compartida.
  • Cambiar la lista de imágenes del sistema.

Una aplicación notifica al Shell llamando a SHChangeNotify con los detalles de lo que ha cambiado. Después, el Shell puede actualizar su imagen del espacio de nombres para reflejar con precisión su nuevo estado.

Ejemplo sencillo de administración de archivos con SHFileOperation

La siguiente aplicación de consola de ejemplo muestra el uso de SHFileOperation para copiar archivos de un directorio a otro. Los directorios de origen y destino, C:\My_Docs y C:\My_Docs2, se codifican de forma rígida en la aplicación para simplificar.

#include <shlobj.h>
#include <shlwapi.h>
#include <strsafe.h>

int main(void)
{
    IShellFolder *psfDeskTop = NULL;
    IShellFolder *psfDocFiles = NULL;
    LPITEMIDLIST pidlDocFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IEnumIDList *ppenum = NULL;
    SHFILEOPSTRUCT sfo;
    STRRET strDispName;
    TCHAR szParseName[MAX_PATH];
    TCHAR szSourceFiles[256];
    int i;
    int iBufPos = 0;
    ULONG chEaten;
    ULONG celtFetched;
    size_t ParseNameSize = 0;
    HRESULT hr;
    

    szSourceFiles[0] = '\0';
    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->ParseDisplayName(NULL, NULL, L"c:\\My_Docs", 
         &chEaten, &pidlDocFiles, NULL);
    hr = psfDeskTop->BindToObject(pidlDocFiles, NULL, IID_IShellFolder, 
         (LPVOID *) &psfDocFiles);
    hr = psfDeskTop->Release();

    hr = psfDocFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 
         &ppenum);

    while( (hr = ppenum->Next(1,&pidlItems, &celtFetched)) == S_OK 
       && (celtFetched) == 1)
    {
        psfDocFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, 
            &strDispName);
        StrRetToBuf(&strDispName, pidlItems, szParseName, MAX_PATH);
        
        hr = StringCchLength(szParseName, MAX_PATH, &ParseNameSize);
        
        if (SUCCEEDED(hr))
        {
            for(i=0; i<=ParseNameSize; i++)
            {
                szSourceFiles[iBufPos++] = szParseName[i];
            }
            CoTaskMemFree(pidlItems);
        }
    }
    ppenum->Release();
    
    szSourceFiles[iBufPos] = '\0';

    sfo.hwnd = NULL;
    sfo.wFunc = FO_COPY;
    sfo.pFrom = szSourceFiles;
    sfo.pTo = "c:\\My_Docs2\0";
    sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;

    hr = SHFileOperation(&sfo);
    
    SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, (LPCVOID) "c:\\My_Docs2", 0);

    CoTaskMemFree(pidlDocFiles);
    psfDocFiles->Release();

    return 0;
}

La aplicación recupera primero un puntero a la interfaz IShellFolder del escritorio. A continuación, recupera el PIDL del directorio de origen pasando su ruta de acceso completa a IShellFolder::P arseDisplayName. Tenga en cuenta que IShellFolder::P arseDisplayName requiere que la ruta de acceso del directorio sea una cadena Unicode. A continuación, la aplicación se enlaza al directorio de origen y usa su interfaz IShellFolder para recuperar la interfaz IEnumIDList de un objeto enumerador.

A medida que se enumera cada archivo del directorio de origen, IShellFolder::GetDisplayNameOf se usa para recuperar su nombre. Se establece la marca SHGDN_FORPARSING, lo que hace que IShellFolder::GetDisplayNameOf devuelva la ruta de acceso completa del archivo. Las rutas de acceso de archivo, incluidos los caracteres NULL de terminación, se concatenan en una sola matriz, szSourceFiles. Se anexa un segundo carácter NULL a la ruta de acceso final para finalizar correctamente la matriz.

Una vez completada la enumeración, la aplicación asigna valores a una estructura SHFILEOPSTRUCT . Tenga en cuenta que la matriz asignada a pTo para especificar el destino también debe terminar con un valor NULL doble. En este caso, simplemente se incluye en la cadena que se asigna a pTo. Dado que se trata de una aplicación de consola, las marcas FOF_SILENT, FOF_NOCONFIRMATION y FOF_NOCONFIRMMKDIR se establecen para suprimir los cuadros de diálogo que puedan aparecer. Después de que SHFileOperation se devuelva, se llama a SHChangeNotify para notificar al Shell del cambio. A continuación, la aplicación realiza la limpieza habitual y devuelve.

Agregar archivos a la lista de documentos recientes del shell

El Shell mantiene una lista de documentos agregados o modificados recientemente para cada usuario. El usuario puede mostrar una lista de vínculos a estos archivos haciendo clic en Documentos en el menú Inicio. Al igual que con Mis documentos, cada usuario tiene un directorio del sistema de archivos para contener los vínculos reales. Para recuperar el PIDL del directorio Recent del usuario actual, la aplicación puede llamar a SHGetFolderLocation con CSIDL_RECENT o llamar a SHGetFolderPath para recuperar su ruta de acceso.

La aplicación puede enumerar el contenido de la carpeta Recent mediante las técnicas descritas anteriormente en este documento. Sin embargo, una aplicación no debe modificar el contenido de la carpeta como si fuera una carpeta del sistema de archivos normal. Si lo hace, la lista de documentos recientes del Shell no se actualizará correctamente y los cambios no se reflejarán en el menú Inicio. En su lugar, para agregar un vínculo de documento a la carpeta Recent de un usuario, la aplicación puede llamar a SHAddToRecentDocs. El Shell agregará un vínculo a la carpeta del sistema de archivos adecuada, así como actualizar su lista de documentos recientes y el menú Inicio. También puede usar esta función para borrar la carpeta.