2010-12-12 35 views
4

Je dois stocker des informations uniques pour chaque site auquel accèdent mes utilisateurs. (Il s'agit en fait d'une vignette du site qu'il a regardé.)
Cette vignette (fichier jpeg) doit avoir un nom indiquant le site qu'il représente afin qu'il puisse être visualisé plus tard.Traduire l'URL en un nom de fichier valide et revenir à l'adresse URL

Pouvez-vous recommander une traduction simple d'url à un nom de fichier valide et de retour? Exemple: www.ibm.com peut être mappé à www_ibm_com.

Je ne suis pas sûr que cela fonctionnera toujours avec toutes les URL valides dans certains cas, les URL ont des chaînes de requête très complexes.

Existe-t-il une bonne bibliothèque regex ou C# qui peut être utilisée?

Merci d'avance et soyez heureux.

Répondre

2

Tout d'abord, il vaut la peine de souligner que "." est parfaitement légal dans les noms de fichiers, mais "/" ne l'est pas, alors même si l'exemple que vous citez n'a pas besoin d'être traduit, "www.ibm.com/path1/file1.jpg" le ferait.

Un simple string.Replace serait la meilleure solution ici - en supposant que vous pouvez trouver un caractère qui est légal dans un nom de fichier mais illégal dans une URL.

Si l'on suppose que le caractère URL illégale est "§" (qui peut être légal dans une URL), vous avez:

string.Replace("/", "§"); 

pour traduire un nom de fichier et:

string.Replace("§", "/"); 

pour traduire.

This page on URL Encoding définit les caractères valides, invalides et dangereux (valides mais avec une signification particulière) pour les URL. Les caractères dans la "moitié supérieure" de l'hex ISO-Latin 80-FF (128-255 décimal.) Ne sont pas légaux mais peuvent être OK dans les noms de fichiers.

Vous devrez effectuer cette opération pour chaque caractère de l'URL figurant dans l'ensemble des caractères de nom de fichier non valides. Vous pouvez l'obtenir en utilisant GetInvalidFileNameChars.

MISE À JOUR

En supposant que vous ne pouvez pas trouver des paires de caractères appropriés, puis une autre solution serait d'utiliser une table de consultation. Une colonne contient l'URL l'autre le nom de fichier généré. Tant que le nom généré est unique (un GUID le ferait), vous pouvez effectuer une recherche bidirectionnelle pour passer de l'un à l'autre.

+0

@ChrisF - Savez-vous par hasard quels sont les caractères d'URL légaux qui sont illégaux dans les noms de fichiers? Je pourrais utiliser votre approche Si je connaissais la liste. Une idée de l'endroit où regarder? –

+0

Cette méthode peut avoir un problème. Par exemple, si le '.' Caractère était présent de toute façon dans l'URL qui est un caractère de nom de fichier valide, alors cela peut entraîner une ambiguïté. Le mieux serait de choisir une sorte de convention, quelque chose de similaire à la façon dont les caractères spéciaux de l'URL sont convertis en leur valeur ASCII en utilisant%. –

+0

@Gunner - Si vous lisez ma réponse, je signale que vous devez trouver un caractère légal, mais une URL illégale. Dans ce cas, il ne peut pas apparaître dans une URL, il est donc sûr de convertir le "/" en. Vous devez répéter pour tous les caractères illégaux. – ChrisF

1

www.ibm.com est actuellement un nom de fichier valide. Plus problématiques sont les barres obliques. Donc, si l'URL contient des sous-répertoires, vous devrez traduire les barres obliques.

Le problème principal est alors les doublons possibles. Par exemple, ibm.com/path1_path2 et ibm.com/path1/path2 traduiraient tous les deux par la même valeur. J'aime la suggestion de ChrisF de trouver un personnage qui est légal dans les noms de fichiers mais pas dans les URL, bien que je ne sais même pas quel caractère, le cas échéant, qui serait hors de ma tête.

Si vous ne trouvez pas un tel personnage, vous devrez peut-être conserver un caractère improbable.