162 votes

Différence entre la barre oblique (/) et la barre oblique inverse (\) dans le chemin d'accès au fichier

Je m'interrogeais sur la différence entre \ et / dans les chemins d'accès aux fichiers. J'ai remarqué que, parfois, un chemin contient / et parfois c'est avec \ .

Il serait bon que quelqu'un puisse expliquer quand il faut utiliser \ et / .

4 votes

Différence dans quel contexte ? Un contexte webby ? L'échappement dans les chaînes de caractères C# ? Il est étiqueté avec ASP.NET.

9 votes

0 votes

Top link googling for "Difference between forward slash and backslash in file path" : howtogeek.com/181774/ l'explique assez bien

256voto

PC Luddite Points 4600

/ est le séparateur de chemin sur Unix et les systèmes de type Unix. Les systèmes Windows modernes peuvent généralement utiliser les deux types de séparateurs \ et / de manière interchangeable pour les chemins d'accès aux fichiers, mais Microsoft a préconisé l'utilisation de \ comme séparateur de chemin depuis des décennies.

Ceci pour des raisons historiques qui remontent aux années 70, précédant Windows de plus d'une décennie. Au début, MS-DOS (la base des premiers Windows) ne prenait pas en charge les répertoires. Unix prenait en charge les répertoires à l'aide de la fonction / depuis le début. Cependant, lorsque les répertoires ont été ajoutés dans MS-DOS 2.0, Microsoft et IBM utilisaient déjà le caractère / caractère pour Commutateurs de commande et en raison de l'analyseur léger de DOS (dérivé de QDOS conçu pour fonctionner sur du matériel bas de gamme), ils n'ont pas réussi à trouver un moyen viable d'utiliser le système d'exploitation du / sans rompre la compatibilité avec leurs applications existantes.

Ainsi, pour éviter les erreurs de type "missing a switch" ou "invalid switch" lorsque l'on passe des chemins d'accès aux fichiers comme arguments à des commandes telles que celles-ci :

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

il a été décidé que la \ serait utilisé à la place, de sorte que vous pourriez écrire ces commandes comme suit

cd\
dir folder1\folder2

sans erreur.

Plus tard, Microsoft et IBM ont collaboré à un système d'exploitation sans rapport avec le DOS, appelé OS/2 . OS/2 avait la possibilité d'utiliser les deux séparateurs, probablement pour attirer davantage de développeurs Unix. Lorsque Microsoft et IBM se sont séparés en 1990 Microsoft a repris le code dont il disposait et a créé Windows NT sur lequel sont basées toutes les versions modernes de Windows, et qui porte en lui cet agnosticisme du séparateur.


Comme la compatibilité ascendante a été le mot d'ordre de Microsoft dans toutes les grandes transitions de systèmes d'exploitation qu'elle a entreprises (DOS à Win16/DOS, à Win16/Win32, à Win32/WinNT), cette particularité est restée, et elle existera probablement encore pendant un certain temps.

C'est pour cette raison que cette divergence existe. Elle ne devrait pas avoir d'incidence sur ce que vous faites car, comme je l'ai dit, l'interface utilisateur WinAPI peut généralement les utiliser de manière interchangeable. Cependant, les applications tierces se casseront probablement la figure si vous passez une valeur de / lorsqu'ils s'attendent à une \ entre les noms de répertoire. Si vous utilisez Windows, utilisez \ . Si vous utilisez Unix ou URI (qui trouvent leur origine dans les chemins Unix, mais c'est une autre histoire), puis utiliser la fonction / .


Dans le contexte de C# : Il convient de noter que, dans la mesure où cette est techniquement une question C#, que si vous voulez écrire un code C# plus "portable" qui fonctionne à la fois sur Unix et Windows (même si C# est principalement un langage Windows), vous voudrez peut-être utiliser l'option Path.DirectorySeparatorChar afin que votre code utilise le séparateur préféré sur ce système, et utilisez le champ Path.Combine() pour ajouter des chemins correctement.

59 votes

Et combinez toujours les chemins à l'aide de Path.Combine .

1 votes

Intéressant. Donc sous DOS ou Windows, foo.exe /bar peut être interprété comme un commutateur de ligne de commande, tandis que foo.exe \bar pourrait être interprété comme faisant référence à un fichier/dossier appelé bar qui se trouve dans le répertoire racine \ de l'entraînement actuel, comme C:\ par exemple.

5 votes

Il convient de noter que cette normalisation de / a \ est effectuée dans la couche de compatibilité Win32, ce qui signifie que si vous la contournez, il y aura une différence. L'exemple le plus connu est celui des chemins d'accès de grande longueur : \\?\C:\ fonctionnera comme prévu sur NTFS mais \\?\C:/ ne le fera pas.

20voto

Pekka Points 1555

MS-DOS 1.0 a retenu la convention du caractère '/' de l'option de la ligne de commande (ou du commutateur) de CP/M. À l'époque, il n'y avait pas de structure de répertoire dans le système de fichiers ni de conflit.

Lorsque Microsoft a développé un environnement plus proche d'Unix avec MS-DOS (et PC-DOS) 2.0, il a fallu représenter le séparateur de chemin en utilisant 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 '/' comme caractère de commutation.

A CONFIG.SYS entrée SWITCHAR=- pourrait être utilisé pour remplacer le / par défaut pour améliorer la compatibilité avec Unix. Les commandes intégrées et les utilitaires standard utilisent donc le caractère alternatif. Le séparateur de chemin Unix peut 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.

Il a été peu utilisé et la plupart des outils de tiers sont restés inchangés. La confusion persiste. De nombreux ports d'outils Unix conservent le caractère de commutation "-", tandis que d'autres supportent les deux conventions.

Le processeur de commande PowerShell qui suit met en œuvre des paramètres d'échappement et de commutation rigoureux et évite largement la confusion, sauf lorsque des outils hérités sont utilisés.

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

2 votes

Pour l'anecdote, l'utilisation de / comme introducteur d'options dans divers systèmes d'exploitation PDP-11 tels que RSTS (1970) et RSX (1972) précède celui de CP/M (1973).

9voto

CountryRabbit Points 81

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

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

1 votes

\ et / (ainsi que plusieurs autres symboles) ne peuvent pas être utilisés dans les noms de fichiers parce que DOS ne disposait pas de l'analyseur complexe auquel les utilisateurs d'Unix sont habitués. L'absence d'un bon analyseur est due au fait que MS-DOS descend du QDOS ("Quick and Dirty Operating System"). Il était destiné à faire fonctionner les choses rapidement et sur un matériel limité. Tout cela existe bien sûr encore aujourd'hui pour des raisons de compatibilité ascendante.

3 votes

Il convient de noter que, dans les versions ultérieures de Windows, l'option / a été ajouté en tant que "Alternate_Directory_Separator" (séparateur de répertoire alternatif)

0 votes

@PCLuddite peut-être devrions-nous plutôt penser à la compatibilité ascendante ?

8voto

Sami Points 2081
  • Une URL, normalisée dans la RFC 1738, utilise toujours des barres obliques, quelle que soit la plate-forme.
  • Un chemin d'accès à un fichier et un URI sont différents. \ est correct dans un fichier Windows et / est correct dans un URI.
  • Plusieurs navigateurs (notamment Firefox et Opera) échouent de manière catastrophique lorsque des fichiers rencontrent des URI avec des barres obliques inverses.
  • System.IO.Path.DirectorySeparatorChar pour obtenir le séparateur de chemin actuel

Le présent peut être une ressource pertinente.

11 votes

Un échec catastrophique ? Firefox traduit \ a / automatiquement. Dans mon livre, c'est ce qu'on appelle "fonctionner de manière transparente".

22 votes

Ma maison a pris feu la dernière fois que j'ai utilisé \ dans Firefox

1 votes

@CarstenS, Firefox ne convertit pas automatiquement le backslash en forward slash dans l'URL et n'ouvre pas le lien. Ce module complémentaire corrige l'URL avec la barre oblique inverse et ouvre la page. addons.mozilla.org/en-US/seamonkey/addon/

7voto

Nick L. Points 640

Outre les réponses données, 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 qui appliquent l'analyse lexicale.

Si vous programmez par exemple, il est parfois peu pratique de devoir échapper à une barre oblique inverse par une autre ( \\ ) afin de l'utiliser correctement - ou doivent utiliser des chaînes de caractères d'échappement, telles que C# @"\test" .

Bien entendu, comme nous l'avons déjà mentionné, les URI Web utilisent la barre oblique par défaut 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 le / et \ remonte dans l'"histoire de l'informatique", à l'époque du DOS et des systèmes basés sur Unix. HowToGeek a une intéressante article à propos de cette histoire.

En bref, DOS 1.0 a été 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 le plus proche visuellement, qui était \ . D'autre part, Unix utilisait de manière standard / pour les répertoires.

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

0 votes

"les deux barres obliques fonctionnent dans les chemins d'accès au système de fichiers" est incorrect, parce qu'Unix est assez fâché lorsque vous utilisez ` as well as many vous avez raison de dire que les Windows récents ont défini la variable d'environnement ALTERNATE_PATH_SEPARATOR qui est par défaut la suivante / Windows peut donc probablement accepter les deux.

1 votes

@TomerW Windows NT a toujours été compatible avec POSIX (bien que les premiers POSIX aient été un véritable fouillis et qu'une partie ait été conservée dans Windows pour des raisons de rétrocompatibilité). Cela incluait la prise en charge de / partout dans le système - bien sûr, les applications pouvaient mal comprendre ces chemins à leur guise, c'est pourquoi cela n'a pas été trop utilisé. Les applications non-CLI qui n'essayaient pas d'effectuer leur propre validation (erronée) des chemins d'accès fonctionnaient bien dès le départ.

0 votes

@Luaan Windows avait la capacité de prendre en charge de nombreuses fonctionnalités POSIX, mais je ne dirais pas qu'il était "compatible POSIX". Bien sûr, il y avait quelques sous-systèmes POSIX que l'on pouvait utiliser au fil des ans, mais ils étaient loin d'être idéaux. Windows 10 prendra en charge Ubuntu bash dans le courant de l'été, ainsi que la prise en charge native des outils Linux fournis avec Ubuntu, de sorte que vous pourrez peut-être faire valoir cela à l'avenir, mais vous ne pouvez certainement pas dire "toujours".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X