Partager via


Gestion du système de fichiers

L’interpréteur de commandes fournit plusieurs façons de gérer les systèmes de fichiers. L’interpréteur de commandes fournit une fonction, SHFileOperation, qui permet à une application de déplacer, copier, renommer et supprimer des fichiers par programmation. L’interpréteur de commandes prend également en charge certaines fonctionnalités de gestion de fichiers supplémentaires.

  • Les documents HTML peuvent être connectés à des fichiers connexes, tels que des fichiers graphiques ou des feuilles de style. Lorsque le document est déplacé ou copié, les fichiers connectés sont automatiquement déplacés ou copiés.
  • Pour les systèmes disponibles pour plusieurs utilisateurs, les fichiers peuvent être gérés par utilisateur. Les utilisateurs ont facilement accès à leurs fichiers de données, mais pas aux fichiers appartenant à d’autres utilisateurs.
  • Si des fichiers de document sont ajoutés ou modifiés, ils peuvent être ajoutés à la liste des documents récents de l’interpréteur de commandes. Lorsque l’utilisateur clique sur la commande Documents dans le menu Démarrer, une liste de liens vers les documents s’affiche.

Ce document décrit le fonctionnement de ces technologies de gestion de fichiers. Il explique ensuite comment utiliser l’interpréteur de commandes pour déplacer, copier, renommer et supprimer des fichiers, et comment gérer des objets dans la Corbeille.

gestion des fichiers Per-User

L’interpréteur de commandes Windows 2000 permet d’associer des fichiers à un utilisateur particulier afin que les fichiers restent masqués aux autres utilisateurs. En termes de système de fichiers, les fichiers sont stockés sous le dossier de profil de l’utilisateur, généralement C:\Documents and Settings\Username\ sur les systèmes Windows 2000. Cette fonctionnalité permet à de nombreuses personnes d’utiliser le même ordinateur, tout en conservant la confidentialité de leurs fichiers des autres utilisateurs. Différents utilisateurs peuvent avoir différents programmes disponibles. Il fournit également un moyen simple pour les administrateurs et les applications de stocker des éléments tels que l’initialisation (.ini) ou lier des fichiers (.lnk). Les applications peuvent ainsi conserver un état différent pour chaque utilisateur et récupérer facilement cet état particulier si nécessaire. Il existe également un dossier de profil pour stocker des informations communes à tous les utilisateurs.

Étant donné qu’il n’est pas pratique de déterminer quel utilisateur est connecté et où se trouvent ses fichiers, les dossiers standard par utilisateur sont des dossiers spéciaux et sont identifiés par un CSIDL. Par instance, le CSIDL du dossier Program Files par utilisateur est CSIDL_PROGRAMS. Si votre application appelle SHGetFolderLocation ou SHGetFolderPath avec l’un des CSIDL par utilisateur, la fonction retourne le pointeur vers une liste d’identificateurs d’élément (PIDL) ou un chemin approprié pour l’utilisateur actuellement connecté. Si votre application doit récupérer le chemin d’accès ou le PIDL du dossier de profil, son CSIDL est CSIDL_PROFILE.

Mes documents et mes dossiers d’images

L’une des icônes standard trouvées sur le bureau est Mes documents. Lorsque vous ouvrez ce dossier, il contient les fichiers de documents de l’utilisateur actuel. L’instance de bureau de Mes documents est un dossier virtuel(alias de l’emplacement du système de fichiers utilisé pour stocker physiquement les documents de l’utilisateur) situé juste en dessous du bureau dans la hiérarchie de l’espace de noms.

L’objectif des dossiers Mes documents et Mes images est de fournir aux utilisateurs un moyen simple et sécurisé d’accéder à leurs fichiers de documents et d’images sur un système qui peut avoir plusieurs utilisateurs. Chaque utilisateur se voit attribuer des dossiers de système de fichiers distincts pour ses fichiers. Par exemple, l’emplacement du dossier documents d’un utilisateur dans le système de fichiers est généralement quelque chose comme C:\Documents and Settings\username\My Documents. Il n’est pas nécessaire que les utilisateurs sachent quoi que ce soit sur l’emplacement physique de leurs dossiers de système de fichiers. Ils accèdent simplement à leurs fichiers via l’icône Mes documents.

Notes

Mes documents permet à un utilisateur d’accéder à ses propres fichiers, mais pas à ceux d’un autre utilisateur. Si plusieurs personnes utilisent le même ordinateur, un administrateur peut verrouiller les utilisateurs de la partie du système de fichiers où sont stockés les fichiers réels. Les utilisateurs pourront ainsi travailler sur leurs propres documents via le dossier Mes documents, mais pas sur les documents qui appartiennent à d’autres utilisateurs.

 

Il n’est généralement pas nécessaire qu’une application sache quel utilisateur est connecté ou où se trouve le dossier Mes documents de l’utilisateur dans le système de fichiers. Au lieu de cela, votre application peut récupérer le PIDL de l’icône de bureau Mes documents en appelant la méthode IShellFolder::P arseDisplayName du bureau. Le nom d’analyse utilisé pour identifier le dossier Mes documents n’est pas un chemin de fichier, mais plutôt ::{450d8fba-ad25-11d0-98a8-0800361b1103}. L’expression entre crochets est la forme textuelle du GUID Mes documents. Par exemple, pour récupérer le PIDL de Mes documents, votre application doit utiliser cet appel à IShellFolder::P arseDisplayName.

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

Une fois que votre application a le PIDL Mes documents, elle peut gérer le dossier comme un dossier de système de fichiers normal : énumération d’éléments, analyse, liaison et exécution de toutes les autres opérations de dossier valides. L’interpréteur de commandes mappe automatiquement les modifications apportées à Mes documents ou à ses sous-dossiers aux dossiers de système de fichiers appropriés.

Si votre application a besoin d’accéder au dossier du système de fichiers qui contient les documents de l’utilisateur actuel, transmettez CSIDL_PERSONAL à SHGetFolderLocation. La fonction retourne le PIDL du dossier du système de fichiers affiché dans le dossier Mes documents de l’utilisateur actuel.

Fichiers connectés

Les documents HTML ont souvent un certain nombre de fichiers graphiques associés, un fichier de feuille de style, plusieurs fichiers Microsoft JScript (compatible avec la spécification du langage ECMA 262 ), etc. Lorsque vous déplacez ou copiez le document HTML principal, vous souhaitez généralement déplacer ou copier ses fichiers associés pour éviter toute rupture de liens. Malheureusement, il n’y avait pas de moyen simple jusqu’à présent de déterminer quels fichiers sont liés à un document HTML donné autre qu’en analysant leur contenu. Pour résoudre ce problème, Windows 2000 offre un moyen simple de connecter un document HTML principal à son groupe de fichiers associés. Si la connexion de fichiers est activée, lorsque le document est déplacé ou copié, tous ses fichiers connectés l’accompagnent.

Pour créer un groupe de fichiers connectés, le document principal doit avoir une extension de nom de fichier .html ou .htm. Créez un sous-dossier du dossier parent du document principal. Le nom du sous-dossier doit être le nom du document principal, moins l’extension .htm ou .html, suivi de l’une des extensions répertoriées ci-dessous. Les extensions les plus couramment utilisées sont « .files » ou « _files ». Par instance, si le document principal est nommé MyDoc.htm, le sous-dossier « MyDoc_files » définit le sous-dossier comme conteneur pour les fichiers connectés du document. Si le document principal est déplacé ou copié, le sous-dossier et ses fichiers sont également déplacés ou copiés.

Pour certaines langues, il est possible d’utiliser un équivalent localisé de « _files » pour créer un sous-dossier pour les fichiers connectés. Le tableau suivant répertorie les chaînes valides qui peuvent être ajoutées à un nom de document pour créer un sous-dossier de fichiers connectés. Notez que certaines de ces chaînes ont « - » comme premier caractère plutôt que « _ » ou « . ».

« _archivos »

« _arquivos »

« _bestanden »

« _bylos »

« -Dateien »

« _datoteke »

« _dosyalar »

« _elemei »

« _failid »

« _fails »

« _fajlovi »

« _ficheiros »

« _fichiers »

« -filer »

.files »

« _files »

« _file »

« _fitxers »

« _fitxategiak »

« _pliki »

« _soubory »

« _tiedostot »

 

Notes

Cette fonctionnalité est sensible au cas de l’extension. Par instance, dans l’exemple ci-dessus, un sous-dossier nommé « MyDoc_Files » ne sera pas connecté à MyDoc.htm.

 

L’activation ou la désactivation de la connexion de fichier est contrôlée par une valeur REG_DWORD , NoFileFolderConnection, de la clé de Registre suivante.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer

Cette valeur n’est normalement pas définie et la connexion aux fichiers est activée. Si nécessaire, vous pouvez désactiver la connexion de fichier en ajoutant cette valeur à la clé et en la définissant sur 1. Pour réactiver la connexion de fichier, définissez NoFileFolderConnection sur zéro.

Notes

La connexion de fichier doit normalement être activée, car d’autres applications peuvent en dépendre. Désactivez la connexion de fichier uniquement si cela est absolument nécessaire.

 

Déplacement, copie, changement de nom et suppression de fichiers

L’espace de noms n’est pas statique et les applications doivent généralement gérer le système de fichiers en effectuant l’une des opérations suivantes.

  • Copie d’un objet dans un autre dossier.
  • Déplacement d’un objet vers un autre dossier.
  • Suppression d’un objet.
  • Renommage d’un objet.

Ces opérations sont toutes effectuées avec SHFileOperation. Cette fonction prend un ou plusieurs fichiers sources et produit les fichiers de destination correspondants. Dans le cas de l’opération de suppression, le système tente de placer les fichiers supprimés dans la Corbeille.

Il est également possible de déplacer des fichiers à l’aide de la fonctionnalité glisser-déplacer .

Pour utiliser la fonction, vous devez renseigner les membres d’une structure SHFILEOPSTRUCT et les passer à SHFileOperation. Les membres clés de la structure sont pFrom et pTo.

Le membre pFrom est une chaîne null double qui contient un ou plusieurs noms de fichiers sources. Ces noms peuvent être des chemins d’accès complets ou des caractères génériques DOS standard tels que *.*. Bien que ce membre soit déclaré en tant que chaîne terminée par null, il est utilisé comme mémoire tampon pour contenir plusieurs noms de fichiers. Chaque nom de fichier doit être terminé par le caractère NULL unique habituel. Un caractère NULL supplémentaire doit être ajouté à la fin du nom final pour indiquer la fin de pFrom.

Le membre pTo est une chaîne null double, comme pFrom. Le membre pTo contient les noms d’un ou plusieurs noms de destination complets. Ils sont emballés dans pTo de la même façon qu’ils le sont pour pFrom. Si pTo contient plusieurs noms, vous devez également définir l’indicateur FOF_MULTIDESTFILES dans le membre fFlags . L’utilisation de pTo dépend de l’opération décrite ici.

  • Pour les opérations de copie et de déplacement, si tous les fichiers sont destinés à un répertoire unique, pTo contient le nom complet du répertoire. Si les fichiers vont à des destinations différentes, pTo peut également contenir un répertoire complet ou un nom de fichier pour chaque fichier source. S’il n’existe pas de répertoire, le système le crée.
  • Pour les opérations de renommage, pTo contient un chemin complet pour chaque fichier source dans pFrom.
  • Pour les opérations de suppression, pTo n’est pas utilisé.

Notification de l’interpréteur de commandes

Informez l’interpréteur de commandes de la modification après avoir utilisé SHFileOperation pour déplacer, copier, renommer ou supprimer des fichiers, ou après avoir pris toute autre action qui affecte l’espace de noms. Les actions qui doivent être accompagnées d’une notification sont les suivantes :

  • Ajout ou suppression de fichiers ou de dossiers.
  • Déplacement, copie ou changement de nom de fichiers ou de dossiers.
  • Modification d’une association de fichiers.
  • Modification des attributs de fichier.
  • Ajout ou suppression de lecteurs ou de supports de stockage.
  • Création ou désactivation d’un dossier partagé.
  • Modification de la liste d’images système.

Une application avertit l’interpréteur de commandes en appelant SHChangeNotify avec les détails de ce qui a changé. L’interpréteur de commandes peut ensuite mettre à jour son image de l’espace de noms pour refléter précisément son nouvel état.

Exemple simple de gestion de fichiers avec SHFileOperation

L’exemple d’application console suivant illustre l’utilisation de SHFileOperation pour copier des fichiers d’un répertoire vers un autre. Les répertoires source et de destination, C:\My_Docs et C:\My_Docs2, sont codés en dur dans l’application par souci de simplicité.

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

L’application récupère d’abord un pointeur vers l’interface IShellFolder du bureau. Il récupère ensuite le PIDL du répertoire source en passant son chemin complet à IShellFolder::P arseDisplayName. Notez que IShellFolder::P arseDisplayName nécessite que le chemin d’accès du répertoire soit une chaîne Unicode. L’application se lie ensuite au répertoire source et utilise son interface IShellFolder pour récupérer l’interface IEnumIDList d’un objet énumérateur.

Chaque fichier du répertoire source étant énuméré, IShellFolder::GetDisplayNameOf est utilisé pour récupérer son nom. L’indicateur SHGDN_FORPARSING est défini, ce qui permet à IShellFolder::GetDisplayNameOf de renvoyer le chemin complet du fichier. Les chemins de fichier, y compris les caractères NULL de fin, sont concaténés dans un tableau unique, szSourceFiles. Un deuxième caractère NULL est ajouté au chemin d’accès final pour terminer correctement le tableau.

Une fois l’énumération terminée, l’application affecte des valeurs à une structure SHFILEOPSTRUCT . Notez que le tableau affecté à pTo pour spécifier la destination doit également être terminé par un double NULL. Dans ce cas, il est simplement inclus dans la chaîne affectée à pTo. Étant donné qu’il s’agit d’une application console, les indicateurs FOF_SILENT, FOF_NOCONFIRMATION et FOF_NOCONFIRMMKDIR sont définis pour supprimer toutes les boîtes de dialogue qui peuvent s’afficher. Après le retour de SHFileOperation , SHChangeNotify est appelé pour notifier l’interpréteur de commandes de la modification. Ensuite, l’application effectue le nettoyage habituel et retourne.

Ajout de fichiers à la liste des documents récents de l’interpréteur de commandes

L’interpréteur de commandes conserve une liste de documents récemment ajoutés ou modifiés pour chaque utilisateur. L’utilisateur peut afficher une liste de liens vers ces fichiers en cliquant sur Documents dans le menu Démarrer. Comme avec Mes documents, chaque utilisateur dispose d’un répertoire de système de fichiers pour contenir les liens réels. Pour récupérer le PIDL du répertoire récent de l’utilisateur actuel, votre application peut appeler SHGetFolderLocation avec CSIDL_RECENT, ou appeler SHGetFolderPath pour récupérer son chemin.

Votre application peut énumérer le contenu du dossier Récent à l’aide des techniques décrites plus haut dans ce document. Toutefois, une application ne doit pas modifier le contenu du dossier comme s’il s’agissait d’un dossier de système de fichiers normal. Dans ce cas, la liste des documents récents de l’interpréteur de commandes ne sera pas mise à jour correctement et les modifications ne seront pas reflétées dans le menu Démarrer. Au lieu de cela, pour ajouter un lien de document au dossier Récent d’un utilisateur, votre application peut appeler SHAddToRecentDocs. L’interpréteur de commandes ajoute un lien vers le dossier du système de fichiers approprié, ainsi que la mise à jour de sa liste de documents récents et du menu Démarrer. Vous pouvez également utiliser cette fonction pour effacer le dossier.