Le .NET Framework a-t-il des méthodes pour convertir un chemin (par exemple "C:\whatever.txt"
) en URI de fichier (par exemple "file:///C:/whatever.txt"
)?
La classe System.Uri a l'inverse (d'un URI de fichier à un chemin absolu), mais rien pour autant que je puisse trouver pour convertir en URI de fichier.
En outre, ce n'est pas une application ASP.NET.
var path = new Uri("file:///C:/whatever.txt").LocalPath;
transforme également un Uri en chemin de fichier local pour tous ceux qui en ont besoin.new Uri(@"C:\%51.txt").AbsoluteUri
vous donne"file:///C:/Q.txt"
au lieu de"file:///C:/%2551.txt"
Ce que personne ne semble réaliser, c'est qu'aucun des
System.Uri
constructeurs ne gère correctement certains chemins contenant des signes de pourcentage.Cela vous donne
"file:///C:/Q.txt"
au lieu de"file:///C:/%2551.txt"
.Aucune des valeurs de l'argument obsolète dontEscape ne fait de différence, et la spécification de UriKind donne également le même résultat. Essayer avec UriBuilder n'aide pas non plus:
Cela revient
"file:///C:/Q.txt"
également.Pour autant que je sache, le cadre manque réellement de moyen de le faire correctement.
Nous pouvons essayer en remplaçant les barres obliques inverses par des barres obliques et en alimentant le chemin vers
Uri.EscapeUriString
- c.- à -d.Cela semble fonctionner au début, mais si vous lui donnez le chemin,
C:\a b.txt
vous vous retrouvez avecfile:///C:/a%2520b.txt
au lieu defile:///C:/a%20b.txt
- d'une manière ou d'une autre, il décide que certaines séquences doivent être décodées mais pas d'autres. Maintenant, nous pourrions simplement préfixer avec"file:///"
nous-mêmes, mais cela ne prend pas en compte les chemins UNC\\remote\share\foo.txt
- ce qui semble généralement accepté sous Windows est de les transformer en pseudo-URL du formulairefile://remote/share/foo.txt
, nous devons donc en tenir compte également.EscapeUriString
a aussi le problème qu'il n'échappe pas au'#'
personnage. Il semblerait à ce stade que nous n'avons pas d'autre choix que de créer notre propre méthode à partir de zéro. Voici donc ce que je propose:Cela laisse intentionnellement + et: non encodé car cela semble être la façon dont cela se fait habituellement sous Windows. Il n'encode également que latin1 car Internet Explorer ne peut pas comprendre les caractères unicode dans les URL des fichiers s'ils sont encodés.
la source
Les solutions ci-dessus ne fonctionnent pas sous Linux.
À l'aide de .NET Core, la tentative d'exécution
new Uri("/home/foo/README.md")
entraîne une exception:Vous devez donner au CLR quelques conseils sur le type d'URL dont vous disposez.
Cela marche:
... et la chaîne renvoyée par
fileUri.ToString()
est"file:///home/foo/README.md"
Cela fonctionne également sur Windows.
new Uri(new Uri("file://"), @"C:\Users\foo\README.md").ToString()
... émet
"file:///C:/Users/foo/README.md"
la source
new Uri("/path/to/file", UriKind.Absolute);
VB.NET:
Différentes sorties:
Bon mot:
la source
AbsoluteUri
est correct car il code également les espaces en% 20.Au moins dans .NET 4.5+, vous pouvez également faire:
la source
UriFormatException
un jour?new Uri(@"C:\%51.txt",UriKind.Absolute).AbsoluteUri
retourne"file:///C:/Q.txt"
au lieu de"file:///C:/%2551.txt"
UrlCreateFromPath à la rescousse! Eh bien, pas entièrement, car il ne prend pas en charge les formats de chemin étendus et UNC, mais ce n'est pas si difficile à surmonter:
Si le chemin commence par un préfixe spécial, il est supprimé. Bien que la documentation ne le mentionne pas, la fonction affiche la longueur de l'URL même si le tampon est plus petit, donc j'obtiens d'abord la longueur puis alloue le tampon.
Certains très observation intéressante que j'ai faite est que tandis que "\\ device \ path" est correctement transformé en "file: // device / path", spécifiquement "\\ localhost \ path" est transformé en seulement "file: /// path" .
La fonction WinApi a réussi à coder les caractères spéciaux, mais laisse les caractères spécifiques à Unicode non codés, contrairement au constructeur Uri . Dans ce cas, AbsoluteUri contient l'URL correctement encodée, tandis que OriginalString peut être utilisé pour conserver les caractères Unicode.
la source
La solution de contournement est simple. Utilisez simplement la méthode Uri (). ToString () et codez en pourcentage les espaces blancs, le cas échéant, par la suite.
renvoie correctement le fichier: /// C: / mon% 20exemple ㄓ .txt
la source