J'ai besoin d'un moyen robuste et simple pour supprimer le chemin d'accès illégal et les caractères de fichier d'une chaîne simple. J'ai utilisé le code ci-dessous mais il ne semble rien faire, que me manque-t-il?
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";
illegal = illegal.Trim(Path.GetInvalidFileNameChars());
illegal = illegal.Trim(Path.GetInvalidPathChars());
Console.WriteLine(illegal);
Console.ReadLine();
}
}
}
GetInvalidFileNameChars()
supprimera des choses comme: \ etc des chemins de dossier.Path.GetInvalidPathChars()
ne semble pas se déshabiller*
ou?
Réponses:
Essayez plutôt quelque chose comme ça;
Mais je dois être d'accord avec les commentaires, j'essaierais probablement de traiter la source des chemins illégaux, plutôt que d'essayer de transformer un chemin illégal en un chemin légitime mais probablement involontaire.
Edit: Ou une solution potentiellement «meilleure», en utilisant Regex.
Pourtant, la question mérite d'être posée, pourquoi vous faites cela en premier lieu.
la source
GetInvalidPathChars()
contenir des caractères quiGetInvalidFileNameChars()
ne le seraient pas. Vous n'acceptez pas l'exactitude d'une optimisation "prématurée". Vous utilisez simplement un mauvais code.La question d'origine demandait de "supprimer les caractères illégaux":
Vous pouvez plutôt les remplacer:
Cette réponse était sur un autre fil de Ceres , je l'aime vraiment bien et simple.
la source
J'utilise Linq pour nettoyer les noms de fichiers. Vous pouvez facilement l'étendre pour vérifier également les chemins valides.
Mise à jour
Certains commentaires indiquent que cette méthode ne fonctionne pas pour eux, j'ai donc inclus un lien vers un extrait DotNetFiddle afin que vous puissiez valider la méthode.
https://dotnetfiddle.net/nw1SWY
la source
var invalid = new HashSet<char>(Path.GetInvalidPathChars()); return new string(originalString.Where(s => !invalid.Contains(s)).ToArray())
. Les performances ne sont probablement pas excellentes, mais cela n'a probablement pas d'importance.Vous pouvez supprimer des caractères illégaux en utilisant Linq comme ceci:
EDIT
Voici à quoi cela ressemble avec l'édition requise mentionnée dans les commentaires:
la source
Ce sont toutes d'excellentes solutions, mais elles dépendent toutes
Path.GetInvalidFileNameChars
, qui ne sont peut-être pas aussi fiables que vous ne le pensez. Notez la remarque suivante dans la documentation MSDN surPath.GetInvalidFileNameChars
:Ce n'est pas mieux avec la
Path.GetInvalidPathChars
méthode. Il contient exactement la même remarque.la source
Pour les noms de fichiers:
Pour les chemins complets:
Notez que si vous avez l'intention de l'utiliser comme fonctionnalité de sécurité, une approche plus robuste consisterait à développer tous les chemins, puis à vérifier que le chemin fourni par l'utilisateur est bien un enfant d'un répertoire auquel l'utilisateur devrait avoir accès.
la source
Pour commencer, Trim supprime uniquement les caractères du début ou de la fin de la chaîne . Deuxièmement, vous devez évaluer si vous voulez vraiment supprimer les caractères offensants, ou échouer rapidement et indiquer à l'utilisateur que son nom de fichier n'est pas valide. Mon choix est le dernier, mais ma réponse devrait au moins vous montrer comment faire les choses dans le bon et le mauvais sens:
Question StackOverflow montrant comment vérifier si une chaîne donnée est un nom de fichier valide . Notez que vous pouvez utiliser l'expression régulière de cette question pour supprimer les caractères avec un remplacement d'expression régulière (si vous en avez vraiment besoin).
la source
La meilleure façon de supprimer le caractère illégal de l'entrée utilisateur consiste à remplacer le caractère illégal à l'aide de la classe Regex, à créer une méthode dans le code derrière ou à valider côté client à l'aide du contrôle RegularExpression.
OU
la source
J'utilise des expressions régulières pour y parvenir. Tout d'abord, je crée dynamiquement l'expression régulière.
Ensuite, j'appelle simplement removeInvalidChars.Replace pour faire la recherche et le remplacement. Cela peut évidemment être étendu pour couvrir également les caractères de chemin.
la source
new Regex(String.Format("^(CON|PRN|AUX|NUL|CLOCK\$|COM[1-9]|LPT[1-9])(?=\..|$)|(^(\.+|\s+)$)|((\.+|\s+)$)|([{0}])", Regex.Escape(new String(Path.GetInvalidFileNameChars()))), RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);
Je préfère absolument l'idée de Jeff Yates. Cela fonctionnera parfaitement, si vous le modifiez légèrement:
L'amélioration consiste simplement à échapper à l'expression régulière générée automatiquement.
la source
Voici un extrait de code qui devrait aider pour .NET 3 et supérieur.
la source
La plupart des solutions ci-dessus combinent des caractères illégaux pour le chemin et le nom de fichier qui sont incorrects (même lorsque les deux appels renvoient actuellement le même ensemble de caractères). Je diviserais d'abord le chemin + nom de fichier en chemin et nom de fichier, puis appliquer l'ensemble approprié à l'un d'eux, puis combiner à nouveau les deux.
wvd_vegt
la source
Si vous supprimez ou remplacez par un seul caractère les caractères non valides, vous pouvez avoir des collisions:
Voici une méthode simple pour éviter cela:
Le résultat:
la source
Jetez une exception.
la source
J'ai écrit ce monstre pour le plaisir, il vous permet d'aller-retour:
la source
Je pense qu'il est beaucoup plus facile de valider à l'aide d'une expression régulière et de spécifier quels caractères sont autorisés, au lieu d'essayer de vérifier tous les mauvais caractères. Voir ces liens: http://www.c-sharpcorner.com/UploadFile/prasad_1/RegExpPSD12062005021717AM/RegExpPSD.aspx http://www.windowsdevcenter.com/pub/a/oreilly/windows/news/csharp_0101.html
Faites également une recherche pour les "éditeurs d'expressions régulières", ils aident beaucoup. Il y en a autour qui sortent même le code en c # pour vous.
la source
Cela semble être O (n) et ne dépense pas trop de mémoire sur les chaînes:
la source
En parcourant les réponses ici, elles semblent toutes ** impliquer l'utilisation d'un tableau de caractères de caractères de nom de fichier non valides.
Certes, cela peut être une micro-optimisation - mais pour le bénéfice de quiconque cherche à vérifier un grand nombre de valeurs pour être des noms de fichiers valides, il convient de noter que la création d'un hachage de caractères non valides améliorera considérablement les performances.
J'ai été très surpris (choqué) par le passé de la rapidité avec laquelle un hachage (ou un dictionnaire) surpasse l'itération sur une liste. Avec des cordes, c'est un nombre ridiculement bas (environ 5-7 éléments de mémoire). Avec la plupart des autres données simples (références d'objet, nombres, etc.), le croisement magique semble être d'environ 20 éléments.
Il y a 40 caractères non valides dans la "liste" Path.InvalidFileNameChars. A fait une recherche aujourd'hui et il y a un bon point de repère ici sur StackOverflow qui montre que le hachage prendra un peu plus de la moitié du temps d'un tableau / liste pour 40 éléments: https://stackoverflow.com/a/10762995/949129
Voici la classe d'assistance que j'utilise pour nettoyer les chemins. J'oublie maintenant pourquoi j'avais une option de remplacement sophistiquée, mais c'est là comme un joli bonus.
Méthode de bonus supplémentaire "IsValidLocalPath" aussi :)
(** ceux qui n'utilisent pas d'expressions régulières)
la source
Vous pouvez utiliser clairement la méthode.
la source
Nom du fichier ne peut contenir que des caractères de
Path.GetInvalidPathChars()
,+
et des#
symboles, et les autres noms de particuliers. Nous avons combiné tous les chèques en une seule classe:La méthode
GetValidFileName
remplace toutes les données incorrectes par_
.la source
Un liner pour nettoyer la chaîne de tous les caractères illégaux pour la dénomination des fichiers Windows:
la source
la source
Cela vous donnera envie et évitera les collisions
la source
Je pense que la question n'a pas encore répondu complètement ... Les réponses ne décrivent que le nom de fichier propre OU le chemin ... pas les deux. Voici ma solution:
la source
J'ai créé une méthode d'extension qui combine plusieurs suggestions:
La source:
la source
Voici une fonction qui remplace tous les caractères illégaux d'un nom de fichier par un caractère de remplacement:
Par exemple, le trait de soulignement peut être utilisé comme caractère de remplacement:
la source
Ou vous pouvez simplement faire
la source