2017-10-08 16 views
1

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?

+0

'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. –

+0

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. –

+0

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. –

Répondre

0

adoption this comment comme la réponse. Une chaîne URI préconstruite doit être utilisée comme paramètre pour le constructeur System.Uri au lieu du chemin local d'origine pour éviter les problèmes de conversion, par ex. new Uri ("file: /// C:% 2551.txt") pour le chemin "% 51.txt".