Il semble que Windows insiste pour écrire une barre oblique inverse \
dans les chemins de fichiers, alors que la classe URI .NET les écrit avec une barre oblique /
. Y a-t-il un moyen juste, accepté même dans les systèmes les plus primitifs? Et pourquoi l'URI de .NET montre-t-il l'autre barre oblique par rapport au reste de Windows?
Un chemin de fichier et un URI sont différents. \
est correct dans un chemin de fichier Windows et /
est correct dans un URI.
Donc, ce chemin de fichier: C:\Documents\Foo
se traduit par cet URI: file:///C:/Documents/Foo
Windows est le bâtard des systèmes d’exploitation à cet égard, mais de nombreuses API acceptent également les barres obliques. Sous Windows, un chemin de fichier ressemble à ceci:
C:\Users\jsmith\Documents\file.txt
Sur un système de type Unix (y compris Mac OS X et Linux), le même chemin devrait ressembler à ceci:
/home/jsmith/Documents/file.txt
Une URL, normalisée dans RFC 1738 , always utilise des barres obliques, quelle que soit la plate-forme:
http://home.example.com/Documents/file.txt
La raison en est historique. Même Windows ne peut pas inverser notre pensée sur les URL. Lorsque vous parlez de barres obliques inverses, la seule plate-forme que vous trouverez qui les utilise est Windows (et quelques autres nouveautés).
Les barres obliques inverses autres que Windows sont des chemins UNC. Cependant, Windows en est également le principal promoteur:
\\HOMESVR\Documents\file.txt
Et quoi que vous fassiez, ne faites pas de publicité pour votre site Web et ne dites pas "mon entreprise dot com back slash promotion".
La raison en est un petit morceau d’histoire. Quand UNIX a été créé, ou plutôt devrais-je dire UNICS, ils ont choisi le séparateur/pour les répertoires ..__ À l'époque, le support de stockage était plutôt petit et chaque répertoire de la racine était un autre périphérique de stockage monté (/ bin/lib etc.)
Lorsque Microsoft publiait la version 1.0 du MS-DOS, il ne prenait pas en charge les répertoires. Ils ont utilisé le caractère/pour les paramètres des programmes (programme/a/b)
MS-DOS 1.0, un changement de nom rapide de Q-DOS, est un système d'exploitation dérivé de CP/M, à partir duquel il a hérité des lettres de lecteur (A: C: etc.).
Comme dans les versions ultérieures, ils voulaient ajouter un support de répertoire, ils ont choisi d'utiliser le \, car le/avait déjà un autre sens dans leur système d'exploitation.
Il existe de nombreux artefacts de l’histoire de l’informatique dans les systèmes d’exploitation modernes, ce que la plupart des gens ne réalisent probablement pas, mais qui ont néanmoins une influence majeure sur leur fonctionnement.
Alors, quelle est la bonne façon? S'il y en a, je dirais que c'est le/parce que les systèmes d'exploitation de type UNIX existaient bien avant que Microsoft implémente la prise en charge des répertoires dans leur DOS.
En guise de remarque, lorsque vous parlez de .NET, vous devez utiliser System.IO.Path.DirectorySeparatorChar
pour obtenir le séparateur de chemin actuel.
En ce qui concerne les séparateurs de chemin du système de fichiers, je pense que sous Windows all , les API acceptent les barres obliques (mais il existe peut-être des erreurs qui ne le font pas) - le problème est que la plupart des applications ne les acceptent pas ( ou les analyser de manière incorrecte).
En fait, si je me souviens bien, même MS-DOS avait accepté "/" en tant que séparateur de chemin au niveau de l'API depuis qu'il commençait à prendre en charge les sous-répertoires (v2.0) - mais à cette date, le caractère "/" le caractère 'switch' pour les options de ligne de commande, de sorte que la barre oblique inverse devienne le séparateur de chemin de facto sous DOS (et plus tard Windows).
Les URI sont un animal similaire mais différent des chemins de fichiers, et les URI doivent toujours utiliser '/' pour séparer les composants. Les applications et les API Windows acceptent probablement «\» comme séparateur dans les URI, probablement parce que les utilisateurs savent utiliser une barre oblique inversée comme séparateur sur ces systèmes et que les URI peuvent également être utilisés pour représenter des fichiers locaux.
Une anecdote inutile du jour - dans certaines versions antérieures de MS-DOS, il existait une API permettant de modifier le caractère de commutation d'option de ligne de commande (généralement de '/' à '-') afin que les commandes aient un aspect plus semblable à Unix et qu'elles accepte '/' comme séparateur de chemin sur la ligne de commande. L'API a été moins que réussie (je suppose parce qu'elle n'était pas universellement prise en charge par les applications) et elle a été supprimée dans les versions ultérieures.
Hmm ... en deuxième lecture, toute cette réponse est une anecdote plutôt inutile.
Windows utilise la barre oblique inverse (\
) pour le délimiteur du système de fichiers. Pour tout le reste, la barre oblique est utilisée (/
). Le type Uri
utilise la barre oblique car il définit ainsi un identificateur de ressource uniform .
Le Web est basé sur la méthode UNIX de délimitation de répertoires dans un chemin avec une barre oblique (/). Windows sépare les répertoires avec des barres obliques inverses (\)
La bonne façon dépend de son utilisation. Pour un chemin d'accès à un fichier local sur une machine Windows, utilisez une barre oblique inverse. Pour un chemin d'accès à une ressource Web ou à un fichier situé sur un ordinateur UNIX (incluant Mac, Linux), utilisez une barre oblique.
La raison pour laquelle l'URI .NET utilise des barres obliques est due au fait qu'il est formaté pour être utilisé dans un navigateur Web.
Le serveur effectuera tout le travail nécessaire pour lier les ressources Web aux fichiers d’un disque dur.
\ La barre oblique inverse est dangereuse, car vous devez faire attention à vous échapper tout le temps. De nombreux langages de programmation ont un équivalent printf qui utilise une barre oblique inverse pour s'échapper.
/ Frontslash est généralement inoffensif.
: les deux points étaient (et sont encore dans une certaine mesure) utilisés par Apple.
Windows accepte les deux pour le chemin.
Essayez d'ouvrir l'explorateur Windows et tapez C:/Temp/Foo
, c:\Temp\Foo
sera correctement ouvert.