web-dev-qa-db-fra.com

Différence entre la barre oblique (/) et la barre oblique inverse (\) dans le chemin du fichier

Je m'interrogeais sur la différence entre \ et / dans les chemins de fichiers. J'ai remarqué que parfois un chemin contient / et parfois avec \.

Ce serait formidable si quelqu'un pouvait expliquer quand utiliser \ et /.

142
Spider man

/ est le séparateur de chemin sur les systèmes Unix et de type Unix. Les fenêtres modernes peuvent généralement utiliser \ et / de manière interchangeable pour les chemins de fichiers, mais Microsoft préconise l’utilisation de \ comme séparateur de chemin depuis des décennies.

Ceci est fait pour des raisons historiques qui remontent aux années 1970, précédant Windows de plus d'une décennie. Au début, MS-DOS (la base de Windows) ne supportait pas les répertoires. Unix avait un support de répertoire utilisant le caractère / depuis le début. Cependant, lorsque des répertoires ont été ajoutés dans MS-DOS 2.0, Microsoft et IBM utilisaient déjà le caractère / pour commutateurs de commande , et à cause de l'analyseur léger de DOS (descendant de QDOS , conçu pour fonctionner sur du matériel de bas niveau), ils ne pouvaient pas trouver un moyen réalisable d'utiliser le caractère / sans rompre la compatibilité avec leurs applications existantes.

Donc, pour éviter les erreurs sur "manque un commutateur" ou "commutateur invalide" lors du passage de chemins de fichiers en tant qu'arguments à des commandes telles que:

cd/                        <---- no switch specified
dir folder1/folder2        <---- /folder2 is not a switch for dir

il a été décidé que le caractère \ serait utilisé à la place, afin que vous puissiez écrire ces commandes comme ceci

cd\
dir folder1\folder2

sans erreur.

Plus tard, Microsoft et IBM ont collaboré sur un système d’exploitation non lié à DOS appelé OS/2 . OS/2 pouvait utiliser les deux séparateurs, probablement pour attirer davantage de développeurs Unix. Quand Microsoft et IBM se séparaient en 199 , Microsoft a pris le code qu'ils avaient et avait créé Windows NT , sur lequel sont basées toutes les versions modernes de Windows, emportant avec lui cet agnosticisme de séparateur .


La compatibilité ascendante étant le nom du jeu pour Microsoft parmi toutes les transitions majeures sous OS entreprises (DOS à Win16/DOS, à Win16/Win32, à Win32/WinNT), cette particularité est restée bloquée et existe pour un moment encore.

C'est pour cette raison que cet écart existe. Cela ne devrait vraiment avoir aucun effet sur ce que vous faites car, comme je l'ai dit, WinAPI peut généralement les utiliser de manière interchangeable. Toutefois, les applications tierces seront probablement interrompues si vous transmettez un / lorsqu'elles s'attendent à un \ entre les noms de répertoire. Si vous utilisez Windows, restez avec \. Si vous utilisez Unix ou URI s (qui ont leur base dans les chemins Unix, mais c'est une autre histoire), utilisez /.


Dans le contexte de C #: Il convient de noter, puisque ceci est techniquement une question en C #, que si vous voulez écrire plus de code C # "portable" qui fonctionne à la fois sous Unix et Windows (même si C # est principalement un langage Windows), vous pouvez utiliser le champ Path.DirectorySeparatorChar pour que votre code utilise le séparateur préféré et utilisez Path.Combine() pour ajouter les chemins correctement.

234
PC Luddite

MS-DOS 1. a conservé la convention de caractère '/' de l'option/(commutateur) en ligne de commande de CP/M. A cette époque, il n'y avait pas de structure de répertoire dans le système de fichiers et pas de conflit.

Lorsque Microsoft a développé un environnement plus semblable à Unix avec MS-DOS (et PC-DOS) 2.0, ils ont dû représenter le séparateur de chemin à l'aide de quelque chose qui n'entrait pas en conflit avec les options de ligne de commande existantes. En interne, le système fonctionne aussi bien avec '/' qu'avec '\'. Le processeur de commande (et de nombreuses applications) a continué à utiliser le caractère "/" en tant que caractère de commutation.

Une CONFIG.SYS l'entrée _SWITCHAR=-_ peut être utilisée pour remplacer la valeur par défaut _/_ afin d'améliorer la compatibilité Unix. Cela fait que les commandes intégrées et les utilitaires standard utilisent le caractère de remplacement. Le séparateur de chemins Unix pourrait alors être utilisé sans ambiguïté pour les noms de fichiers et de répertoires. Cette entrée a été supprimée dans les versions ultérieures, mais un appel DOS a été documenté pour définir la valeur après le démarrage.

C'était peu utilisé et la plupart des outils tiers restaient inchangés. La confusion persiste. De nombreux ports des outils Unix conservent le caractère '-', alors que d'autres prennent en charge les deux conventions.

Le processeur de commandes ultérieur de PowerShell implémente des paramètres d'échappement et de commutation rigoureux et évite en grande partie la confusion, sauf lorsque des outils hérités sont utilisés.

Ni la question ni la réponse ne concernent C #.

20
Pekka

Sur les systèmes Unix, \ est un caractère d'échappement, c'est-à-dire que \ indique à l'analyseur qu'il s'agit d'un espace et non de la fin de l'instruction. Sur les systèmes Unix, / est le séparateur de répertoire.

Sous Windows, \ est le séparateur de répertoire, mais le / ne peut pas être utilisé dans les noms de fichier ou de répertoire.

9
CountryRabbit
  • Une URL, normalisée dans la RFC 1738, utilise toujours des barres obliques, quelle que soit la plate-forme.
  • Un chemin de fichier et un URI sont différents. \ est correct dans un chemin de fichier Windows et / est correct dans un URI.
  • Plusieurs navigateurs (à savoir Firefox et Opera) échouent de façon catastrophique lorsqu'ils rencontrent des URI avec des barres obliques inverses.
  • System.IO.Path.DirectorySeparatorChar pour obtenir le séparateur de chemin actuel

This peut être une ressource pertinente.

8
Sami

Outre les réponses fournies, il convient de mentionner que \ est largement utilisé pour les caractères spéciaux (tels que \n\t) dans les langages de programmation, les éditeurs de texte et les systèmes généraux appliquant l'analyse lexicale.

Si vous programmez par exemple, il est parfois dérangeant d'avoir même besoin d'échapper une barre oblique inverse avec un autre (\\) pour pouvoir l'utiliser correctement - ou d'avoir besoin d'utiliser des chaînes d'échappement, telles que C # @"\test".

Bien entendu, comme mentionné précédemment, les URI Web utilisent la barre oblique standard mais les deux barres obliques fonctionnent dans les outils de ligne de commande les plus récents et les plus courants.

MISE À JOUR: Après quelques recherches, il semble que toute l'histoire entre / et \ remonte dans "l'histoire de l'ordinateur", à l'époque du système DOS et du système Unix de l'époque. HowToGeek a un intéressant article à propos de cette histoire.

En bref, DOS 1.0 était initialement publié par IBM sans prise en charge des répertoires et / était utilisé pour une autre fonctionnalité de commande ("commutation"). Lorsque les répertoires ont été introduits dans la version 2.0, / était déjà utilisé. IBM a donc choisi le symbole visuel le plus proche, à savoir \. D'un autre côté, Unix utilisait en standard / pour les répertoires.

Lorsque les utilisateurs ont commencé à utiliser de nombreux systèmes différents, ils ont commencé à devenir confus, ce qui a incité les développeurs de système d’exploitation à essayer de faire fonctionner les systèmes dans les deux cas - cela s’applique même dans les URL, car certains navigateurs prennent en charge le http: \\ www.test.com\go au format. En général, cela présentait des inconvénients, mais l’ensemble reste aujourd’hui encore invoqué pour des raisons de compartimentabilité, avec une tentative de prise en charge des deux barres obliques sous Windows, même si elles ne sont plus basées sur DOS.

7
Nick Louloudakis

Vous ne devriez pas utiliser non plus en C #. Vous devriez toujours utiliser la classe Path class . Cela contient une méthode appelée Path.Combine qui peut être utilisée pour créer des chemins sans spécifier le séparateur vous-même.

Exemple d'utilisation:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
6
TheLethalCoder

\ est utilisé pour les chemins de fichiers locaux et les chemins de réseau Windows comme dans:

C:\Windows\Temp\ ou \\NetworkSharedDisk\Documents\Archive\

/ est ce qui est requis par les URI standard comme dans:

http://www.stackoverflow.com/

5
Ash