Nommer des fichiers, des chemins d’accès et des espaces de noms

Tous les systèmes de fichiers pris en charge par Windows utilisent le concept de fichiers et de répertoires pour accéder aux données stockées sur un disque ou un appareil. Les développeurs Windows qui travaillent avec les API Windows pour les E/S de fichiers et d’appareils doivent comprendre les différentes règles, conventions et limitations des noms des fichiers et des répertoires.

Les données sont accessibles à partir de disques, d’appareils et de partages réseau à l’aide des API d’E/S de fichiers. Les fichiers et les répertoires, ainsi que les espaces de noms, font partie du concept d’un chemin d’accès, qui est une représentation sous forme de chaîne de l’emplacement où obtenir les données, qu’elles proviennent d’un disque, d’un appareil ou d’une connexion réseau pour une opération spécifique.

Certains systèmes de fichiers, tels que NTFS, prennent en charge les fichiers et répertoires liés, qui suivent également les conventions et règles de nommage des fichiers, comme le ferait un fichier ou un répertoire normal. Pour plus d’informations, consultez Liens durs et jonctions et Analyse des points et opérations de fichier.

Pour plus d’informations, consultez les sous-sections suivantes :

Pour en savoir plus sur la configuration des Windows 10 afin de prendre en charge les chemins d’accès longs, consultez Limitation maximale de la longueur des chemins d’accès.

Noms de fichiers et de répertoires

Tous les systèmes de fichiers suivent les mêmes conventions générales de nommage pour un fichier individuel : un nom de fichier de base et une extension facultative, séparées par un point. Toutefois, chaque système de fichiers, tel que NTFS, CDFS, exFAT, UDFS, FAT et FAT32, peut avoir des règles spécifiques et différentes concernant la formation des composants individuels dans le chemin d’accès à un répertoire ou à un fichier. Notez qu’un répertoire est simplement un fichier avec un attribut spécial le désignant comme répertoire, mais dans le cas contraire, il doit suivre les mêmes règles de nommage qu’un fichier normal. Étant donné que le terme répertoire fait simplement référence à un type spécial de fichier en ce qui concerne le système de fichiers, certains documents de référence utilisent le fichier de termes général pour englober à la fois les concepts de répertoires et de fichiers de données en tant que tels. Pour cette raison, sauf indication contraire, les règles de nommage ou d’utilisation ou les exemples d’un fichier doivent également s’appliquer à un répertoire. Le terme chemin d’accès fait référence à un ou plusieurs répertoires, barres obliques inverses et éventuellement un nom de volume. Pour plus d’informations, consultez la section Chemins d’accès .

Les limitations du nombre de caractères peuvent également être différentes et varier en fonction du système de fichiers et du format de préfixe de nom de chemin d’accès utilisé. Cela est encore compliqué par la prise en charge des mécanismes de compatibilité descendante. Par exemple, l’ancien système de fichiers MS-DOS FAT prend en charge un maximum de 8 caractères pour le nom de fichier de base et de 3 caractères pour l’extension, pour un total de 12 caractères, y compris le séparateur de points. Il s’agit d’un nom de fichier 8.3. Les systèmes de fichiers Windows FAT et NTFS ne sont pas limités aux noms de fichiers 8.3, car ils prennent en charge les noms de fichiers longs, mais ils prennent toujours en charge la version 8.3 des noms de fichiers longs.

Conventions d'affectation de noms

Les règles de base suivantes permettent aux applications de créer et de traiter des noms valides pour les fichiers et les répertoires, quel que soit le système de fichiers :

  • Utilisez un point pour séparer le nom du fichier de base de l’extension dans le nom d’un répertoire ou d’un fichier.

  • Utilisez une barre oblique inverse (\) pour séparer les composants d’un chemin d’accès. La barre oblique inverse divise le nom du fichier du chemin d’accès et un nom de répertoire d’un autre nom de répertoire dans un chemin d’accès. Vous ne pouvez pas utiliser de barre oblique inverse dans le nom du fichier ou du répertoire réel, car il s’agit d’un caractère réservé qui sépare les noms en composants.

  • Utilisez une barre oblique inverse comme requis dans le cadre des noms de volumes, par exemple, « C:\ » dans « C:\path\file » ou « \\server\share » dans « \\server\share\path\file » pour les noms UNC (Universal Naming Convention). Pour plus d’informations sur les noms UNC, consultez la section Limitation de la longueur maximale du chemin d’accès .

  • N’assumez pas le respect de la casse. Par exemple, considérez les noms OSCAR, Oscar et oscar comme étant identiques, même si certains systèmes de fichiers (comme un système de fichiers compatible POSIX) peuvent les considérer comme différents. Notez que NTFS prend en charge la sémantique POSIX pour le respect de la casse, mais ce n’est pas le comportement par défaut. Pour plus d’informations, consultez CreateFile.

  • Les désignateurs de volume (lettres de lecteur) ne respectent pas la casse. Par exemple, « D:\ » et « d:\ » faire référence au même volume.

  • Utilisez n’importe quel caractère de la page de code active pour un nom, y compris les caractères Unicode et les caractères du jeu de caractères étendus (128-255), à l’exception des éléments suivants :

    • Les caractères réservés suivants :

      • < (inférieur à)
      • > (supérieur à)
      • : (deux-points)
      • " (guillemet double)
      • / (barre oblique)
      • \ (barre oblique inverse)
      • | (barre verticale ou canal)
      • ? (point d’interrogation)
      • * (astérisque)
    • Valeur entière zéro, parfois appelée caractère ASCII NUL .

    • Caractères dont les représentations entières sont comprises entre 1 et 31, à l’exception des flux de données alternatifs où ces caractères sont autorisés. Pour plus d’informations sur les flux de fichiers, consultez Flux de fichiers.

    • Tout autre caractère que le système de fichiers cible n’autorise pas.

  • Utilisez un point comme composant de répertoire dans un chemin d’accès pour représenter le répertoire actif, par exemple .\temp.txt ». Pour plus d’informations, consultez Chemins d’accès.

  • Utilisez deux périodes consécutives (..) comme composant de répertoire dans un chemin d’accès pour représenter le parent du répertoire actif, par exemple . \temp.txt ». Pour plus d’informations, consultez Chemins d’accès.

  • N’utilisez pas les noms réservés suivants pour le nom d’un fichier :

    CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 et LPT9. Évitez également ces noms suivis immédiatement d’une extension ; par exemple, NUL.txt et NUL.tar.gz sont tous deux équivalents à NUL. Pour plus d’informations, consultez l’article Espaces de noms.

  • Ne terminez pas un nom de fichier ou de répertoire avec un espace ou un point. Bien que le système de fichiers sous-jacent puisse prendre en charge ces noms, l’interpréteur de commandes Windows et l’interface utilisateur ne le sont pas. Toutefois, il est acceptable de spécifier un point comme premier caractère d’un nom. Par exemple, « .temp ».

Noms courts ou longs

Un nom de fichier long est considéré comme n’importe quel nom de fichier qui dépasse la convention de nommage de style MS-DOS courte (également appelée 8.3). Lorsque vous créez un nom de fichier long, Windows peut également créer une forme 8.3 courte du nom, appelée alias 8.3 ou nom court, et le stocker également sur le disque. Cet alias 8.3 peut être désactivé pour des raisons de performances à l’échelle du système ou pour un volume spécifié, en fonction du système de fichiers particulier.

Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : l’alias 8.3 ne peut pas être désactivé pour les volumes spécifiés tant que Windows 7 et Windows Server 2008 R2.

Sur de nombreux systèmes de fichiers, un nom de fichier contient un tilde (~) dans chaque composant du nom qui est trop long pour se conformer aux règles de nommage 8.3.

Notes

Tous les systèmes de fichiers ne suivent pas la convention de substitution tilde et les systèmes peuvent être configurés pour désactiver la génération d’alias 8.3, même s’ils la prennent normalement en charge. Par conséquent, ne supposez pas que l’alias 8.3 existe déjà sur le disque.

 

Pour demander des noms de fichiers 8.3, des noms de fichiers longs ou le chemin d’accès complet d’un fichier à partir du système, envisagez les options suivantes :

  • Pour obtenir la forme 8.3 d’un nom de fichier long, utilisez la fonction GetShortPathName .
  • Pour obtenir la version de nom de fichier long d’un nom court, utilisez la fonction GetLongPathName .
  • Pour obtenir le chemin complet d’un fichier, utilisez la fonction GetFullPathName .

Sur les systèmes de fichiers plus récents, tels que NTFS, exFAT, UDFS et FAT32, Windows stocke les noms de fichiers longs sur le disque dans Unicode, ce qui signifie que le nom de fichier long d’origine est toujours conservé. Cela est vrai même si un nom de fichier long contient des caractères étendus, quelle que soit la page de code active pendant une opération de lecture ou d’écriture sur disque.

Les fichiers utilisant des noms de fichiers longs peuvent être copiés entre les partitions de système de fichiers NTFS et les partitions de système de fichiers Windows FAT sans perdre d’informations de nom de fichier. Cela peut ne pas être vrai pour les anciens MS-DOS FAT et certains types de systèmes de fichiers CDFS (CD-ROM), en fonction du nom de fichier réel. Dans ce cas, le nom de fichier court est remplacé si possible.

Chemins

Le chemin d’accès à un fichier spécifié se compose d’un ou plusieurs composants, séparés par un caractère spécial (barre oblique inverse), chaque composant étant généralement un nom de répertoire ou un nom de fichier, mais à quelques exceptions notables décrites ci-dessous. Il est souvent essentiel pour l’interprétation par le système d’un chemin à quoi ressemble le début ou le préfixe du chemin d’accès. Ce préfixe détermine l’espace de noms utilisé par le chemin d’accès, ainsi que les caractères spéciaux utilisés à quelle position dans le chemin d’accès, y compris le dernier caractère.

Si un composant d’un chemin d’accès est un nom de fichier, il doit être le dernier composant.

Chaque composant d’un chemin d’accès est également limité par la longueur maximale spécifiée pour un système de fichiers particulier. En général, ces règles se répartissent en deux catégories : courte et longue. Notez que les noms de répertoires sont stockés par le système de fichiers en tant que type spécial de fichier, mais que les règles de nommage des fichiers s’appliquent également aux noms de répertoires. Pour résumer, un chemin d’accès est simplement la représentation sous forme de chaîne de la hiérarchie entre tous les répertoires qui existent pour un nom de fichier ou de répertoire particulier.

Chemins d’accès complets ou relatifs

Pour les fonctions d’API Windows qui manipulent des fichiers, les noms de fichiers peuvent souvent être relatifs au répertoire actif, tandis que certaines API nécessitent un chemin d’accès complet. Un nom de fichier est relatif au répertoire actif s’il ne commence pas par l’un des éléments suivants :

  • Nom UNC de n’importe quel format, qui commence toujours par deux caractères de barre oblique inverse (« \\ »). Pour plus d'informations, consultez la section suivante.
  • Un désignateur de disque avec une barre oblique inverse, par exemple « C:\ » ou « d:\ ».
  • Barre oblique inverse unique, par exemple , « \directory » ou « \file.txt ». Il s’agit également d’un chemin d’accès absolu.

Si un nom de fichier commence uniquement par un désignateur de disque, mais pas par la barre oblique inverse après les deux-points, il est interprété comme un chemin d’accès relatif au répertoire actif sur le lecteur avec la lettre spécifiée. Notez que le répertoire actif peut ou non être le répertoire racine en fonction de ce à quoi il a été défini lors de l’opération de « changement de répertoire » la plus récente sur ce disque. Voici quelques exemples de ce format :

  • « C:tmp.txt » fait référence à un fichier nommé « tmp.txt » dans le répertoire actif sur le lecteur C.
  • « C:tempdir\tmp.txt » fait référence à un fichier dans un sous-répertoire du répertoire actif sur le lecteur C.

Un chemin est également dit relatif s’il contient des « points doubles » ; autrement dit, deux périodes ensemble dans un composant du chemin d’accès. Ce spécificateur spécial est utilisé pour désigner le répertoire au-dessus du répertoire actif, autrement appelé « répertoire parent ». Voici quelques exemples de ce format :

  • ".. \tmp.txt » spécifie un fichier nommé tmp.txt situé dans le parent du répertoire actif.
  • ".. \.. \tmp.txt » spécifie un fichier qui se trouve à deux répertoires au-dessus du répertoire actif.
  • ".. \tempdir\tmp.txt » spécifie un fichier nommé tmp.txt situé dans un répertoire nommé tempdir qui est un répertoire homologue du répertoire actif.

Les chemins relatifs peuvent combiner les deux types d’exemples, par exemple « C:..\tmp.txt ». Cela est utile car, bien que le système effectue le suivi du lecteur actuel avec le répertoire actuel de ce lecteur, il garde également le suivi des répertoires actuels dans chacune des différentes lettres de lecteur (si votre système en a plusieurs), quel que soit le lecteur défini comme lecteur actuel.

Limitation de longueur maximale du chemin

Dans les éditions de Windows antérieures à Windows 10 version 1607, la longueur maximale d’un chemin d’accès est MAX_PATH, qui est définie comme 260 caractères. Dans les versions ultérieures de Windows, la modification d’une clé de Registre ou l’utilisation de l’outil stratégie de groupe est nécessaire pour supprimer la limite. Pour plus d’informations , consultez Limitation maximale de la longueur du chemin d’accès .

Espaces de noms

Il existe deux catégories main de conventions d’espace de noms utilisées dans les API Windows, communément appelées espaces de noms NT et espaces de noms Win32. L’espace de noms NT a été conçu pour être l’espace de noms de niveau le plus bas sur lequel d’autres sous-systèmes et espaces de noms peuvent exister, y compris le sous-système Win32 et, par extension, les espaces de noms Win32. POSIX est un autre exemple de sous-système dans Windows basé sur l’espace de noms NT. Les premières versions de Windows ont également défini plusieurs noms prédéfinis ou réservés pour certains appareils spéciaux, tels que les ports de communication (série et parallèle) et la console d’affichage par défaut dans le cadre de ce qui est maintenant appelé espace de noms d’appareil NT, et sont toujours pris en charge dans les versions actuelles de Windows à des fins de compatibilité descendante.

Espaces de noms de fichiers Win32

Les conventions et préfixes de l’espace de noms Win32 sont résumés dans cette section et la section suivante, avec des descriptions de leur utilisation. Notez que ces exemples sont destinés à être utilisés avec les fonctions d’API Windows et ne fonctionnent pas nécessairement avec des applications de shell Windows telles que Windows Explorer. Pour cette raison, il existe une plus grande gamme de chemins d’accès possibles que ce qui est généralement disponible à partir des applications de l’interpréteur de commandes Windows, et les applications Windows qui en tirent parti peuvent être développées à l’aide de ces conventions d’espace de noms.

Pour les E/S de fichiers, le préfixe « \\?\ » d’une chaîne de chemin indique aux API Windows de désactiver toute analyse de chaîne et d’envoyer la chaîne qui la suit directement au système de fichiers. Par exemple, si le système de fichiers prend en charge des chemins d’accès et des noms de fichiers volumineux, vous pouvez dépasser les limites MAX_PATH qui sont appliquées par les API Windows. Pour plus d’informations sur la limitation de chemin d’accès maximale normale, consultez la section précédente Limitation de la longueur maximale du chemin d’accès.

Étant donné qu’il désactive l’extension automatique de la chaîne de chemin d’accès, le préfixe « \\?\ » autorise également l’utilisation de .. » et « » dans les noms de chemin d’accès, ce qui peut être utile si vous tentez d’effectuer des opérations sur un fichier avec ces spécificateurs de chemin d’accès relatif réservés dans le cadre du chemin complet.

De nombreuses API d’E/S de fichiers, mais pas toutes, prennent en charge « \\? » ; vous devez examiner la rubrique de référence pour chaque API pour vous en assurer.

Notez que les API Unicode doivent être utilisées pour vous assurer que le préfixe « \\?\ » vous permet de dépasser le MAX_PATH

Espaces de noms d’appareil Win32

Le préfixe « \\.\ » accède à l’espace de noms d’appareil Win32 au lieu de l’espace de noms de fichier Win32. C’est ainsi que l’accès aux disques et volumes physiques s’effectue directement, sans passer par le système de fichiers, si l’API prend en charge ce type d’accès. Vous pouvez accéder ainsi à de nombreux appareils autres que les disques (à l’aide des fonctions CreateFile et DefineDosDevice , par exemple).

Par exemple, si vous souhaitez ouvrir le port de communication série 1 du système, vous pouvez utiliser « COM1 » dans l’appel à la fonction CreateFile . Cela fonctionne, car COM1-COM9 font partie des noms réservés dans l’espace de noms NT, bien que l’utilisation du préfixe « \\.\ » fonctionne également avec ces noms d’appareils. En comparaison, si vous avez installé une carte d’extension série 100 ports et que vous souhaitez ouvrir COM56, vous ne pouvez pas l’ouvrir à l’aide de « COM56 », car il n’existe aucun espace de noms NT prédéfini pour COM56. Vous devez l’ouvrir à l’aide de « \\.\COM56 », car « \\.\ » accède directement à l’espace de noms de l’appareil sans tenter de localiser un alias prédéfini.

Un autre exemple d’utilisation de l’espace de noms d’appareil Win32 est l’utilisation de la fonction CreateFile avec « \\.\PhysicalDriveX » (où X est une valeur entière valide) ou « \\.\CdRomX ». Cela vous permet d’accéder directement à ces appareils, en contournant le système de fichiers. Cela fonctionne, car ces noms d’appareils sont créés par le système au fur et à mesure que ces appareils sont énumérés, et certains pilotes créent également d’autres alias dans le système. Par exemple, le pilote de périphérique qui implémente le nom « C:\ » a son propre espace de noms qui se trouve également être le système de fichiers.

Les API qui passent par la fonction CreateFile fonctionnent généralement avec le préfixe « \\.\ », car CreateFile est la fonction utilisée pour ouvrir à la fois les fichiers et les appareils, en fonction des paramètres que vous utilisez.

Si vous utilisez des fonctions d’API Windows, vous devez utiliser le préfixe « \\.\ » pour accéder uniquement aux appareils et non aux fichiers.

La plupart des API ne prennent pas en charge « \\.\ » ; seuls ceux qui sont conçus pour fonctionner avec l’espace de noms de l’appareil le reconnaîtront. Toujours case activée la rubrique de référence pour chaque API pour être sûr.

Espaces de noms NT

Il existe également des API qui autorisent l’utilisation de la convention d’espace de noms NT, mais le Gestionnaire d’objets Windows rend cela inutile dans la plupart des cas. À titre d’exemple, il est utile de parcourir les espaces de noms Windows dans l’explorateur d’objets système à l’aide de l’outil Windows Sysinternals WinObj . Lorsque vous exécutez cet outil, vous voyez l’espace de noms NT commençant à la racine ou « \ ». Le sous-dossier appelé « Global ? ? » est l’emplacement où se trouve l’espace de noms Win32. Les objets d’appareil nommés résident dans l’espace de noms NT dans le sous-répertoire « Appareil ». Ici, vous pouvez également trouver Serial0 et Serial1, les objets d’appareil représentant les deux premiers ports COM s’ils sont présents sur votre système. Un objet d’appareil représentant un volume serait quelque chose comme « HarddiskVolume1 », bien que le suffixe numérique puisse varier. Le nom « DR0 » sous le sous-répertoire « Harddisk0 » est un exemple d’objet d’appareil représentant un disque, et ainsi de suite.

Pour rendre ces objets d’appareil accessibles par les applications Windows, les pilotes d’appareil créent un lien symbolique (symlink) dans l’espace de noms Win32, « Global ? ? », vers leurs objets d’appareil respectifs. Par exemple, COM0 et COM1 sous le sous-répertoire « Global ? » sont simplement des liens symboliques vers Serial0 et Serial1, « C: » est un lien symbolique vers HarddiskVolume1, « Physicaldrive0 » est un lien symbolique vers DR0, et ainsi de suite. Sans symlink, un appareil « Xxx » spécifié ne sera disponible pour aucune application Windows utilisant les conventions d’espace de noms Win32, comme décrit précédemment. Toutefois, un handle peut être ouvert sur cet appareil à l’aide de toutes les API qui prennent en charge le chemin d’accès absolu de l’espace de noms NT au format « \Device\Xxx ».

Avec l’ajout de la prise en charge multi-utilisateur via Les services Terminal Server et les machines virtuelles, il est devenu nécessaire de virtualiser l’appareil racine à l’échelle du système au sein de l’espace de noms Win32. Pour ce faire, vous avez ajouté le lien symlink nommé « GLOBALROOT » à l’espace de noms Win32, que vous pouvez voir dans le sous-répertoire « Global ? ? » de l’outil de navigateur WinObj précédemment abordé, et vous pouvez y accéder via le chemin d’accès « \?\?\GLOBALROOT ». Ce préfixe garantit que le chemin suivant s’affiche dans le chemin d’accès racine réel du gestionnaire d’objets système et non dans un chemin dépendant de la session.

Comparaison des fonctionnalités du système de fichiers