Dans les commentaires à this question il a été noté qu'il était pas toujours possible de convertir un chemin de fichier à la chaîne URI par la classe System.Uri. Cela laisse une question: comment peut-on représenter un chemin de fichier arbitraire en tant que System.Uri?Conversion des chemins de fichiers avec des séquences d'échappement comme à System.Uri
Voici quelques détails. Si une application cible la version .Net en dessous de 4.5, les constructeurs de System.Uri n'essaient pas d'annuler la chaîne d'origine, même si .Net 4.5+ est installé. Donc la question concerne le code ciblant .Net 4.5+. Dans ces versions ultérieures, toute méthode de création d'une instance System.Uri à partir d'une chaîne se termine par un code interne en désordre essayant de "échapper-unescape" l'entrée. Le résultat est que '% 25' n'est jamais non échappé, mais '%' suivi de deux chiffres hexadécimaux codant tout caractère ASCII non spécial est toujours non échappé. Par exemple,
var uri = new System.Uri(@"C:\%51.txt");
donne un uri avec uri.LocalPath == @ "C: \ Q.txt", et
var uri = new System.Uri(@"C:\%2551.txt");
crée un uri avec uri.LocalPath == @ "C: \% 2551.txt ".
À première vue, il semble impossible de convertir assez nom de fichier local valide « % 51.txt » à un équivalent System.Uri. Mais peut-être que quelqu'un connaît un moyen?
'nouveau Uri ("file: ///" + Convert.ToBase64String (Encoding.UTF8.GetBytes (@ "C: \% 51.txt")))'. Je plaisante à moitié. Le seul problème étant, bien entendu, que personne d'autre que vous ne puisse en retrouver le chemin. Mais vous absolument, positivement, éviter tous les problèmes d'échappement que ce soit. –
C'est pourquoi j'ai mentionné un System.Uri équivalent, c'est-à-dire un URI représentant le même chemin de la manière standard. –
L'équivalence implique simplement un mappage un-à-un, qui est facile à établir sous votre propre schéma. Si vous voulez juste mieux échapper que ce que le cadre vous donne, la question à laquelle vous avez lié a en réalité [une réponse] (https://stackoverflow.com/a/35734486/4137916). Je ne sais pas pourquoi cela ne suffirait pas. La question importante semble être ce que le consommateur visé de l'URI est. Si vous devez vous conformer à l'idée d'un logiciel sur la façon dont les chemins doivent être échappés, utilisez-le et, si nécessaire, codez-le vous-même. Sinon, il n'y a aucune raison d'utiliser la mauvaise chose qui est le schéma 'file: //' du tout. –