Je veux inclure la fonctionnalité de renommer fichier batch dans ma demande. Utilisateur peut taper le modèle de nom de fichier de destination et (après le remplacement de certains caractères génériques en jacquard), j’ai besoin de vérifier si elle va être juridique filename sous Windows. J’ai essayé d’utiliser une expression régulière comme [a-zA-Z0-9_] + mais il n’inclut pas de nombre de caractères nationaux spécifiques de diverses langues (trémas, etc.). Quelle est la meilleure façon de faire cette vérification ?
Réponses
Trop de publicités?À partir de MSDN "Appellation d'un Fichier ou d'un Répertoire," voici les conventions générales pour ce légal de nom de fichier est sous Windows:
Vous pouvez utiliser n'importe quel caractère dans la page de code (Unicode/ANSI 127 ci-dessus), à l'exception:
- < > : "/ \ | ? *
- Des personnages dont l'entier des représentations sont de 0 à 31 (moins d'espace ASCII)
- Tout autre caractère que le système de fichiers cible ne permet pas (par exemple, la fuite des périodes ou des espaces)
- Tout le DOS noms: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9 (et éviter AUX.txt, etc)
- Le nom de fichier est l'ensemble des périodes
Certains facultatif choses à vérifier:
- Chemins d'accès aux fichiers (y compris le nom de fichier) ne peut pas avoir plus de 260 caractères (qui n'utilisent pas le "\?\" préfixe)
- Unicode chemins d'accès aux fichiers (y compris le nom de fichier) avec plus de 32 000 caractères lors de l'utilisation de "\?\" (notez que le préfixe peut développer les composants d'annuaire et de provoquer de dépassement de la limite de 32 000)
Vous pouvez obtenir une liste des caractères non valides à partir du Chemin.GetInvalidPathChars
http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx
Et GetInvalidFileNameChars
http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx
UPD: Voir Steve Cooper suggestion sur la façon de les utiliser dans une expression régulière.
UPD2: Note que, conformément à la section Remarques dans MSDN "Le tableau retourné par cette méthode n'est pas garanti pour contenir l'ensemble des caractères qui ne sont pas valides dans les noms de fichier et répertoire." La réponse fournie par sixlettervaliables va plus dans les détails.
Pour .Net Cadres avant de 3,5 cela devrait fonctionner:
Expression régulière correspondant devrait vous obtenir un bout de chemin. Voici un morceau de code à l'aide de l' System.IO.Path.InvalidPathChars
constante;
bool IsValidFilename(string testName)
{
Regex containsABadCharacter = new Regex("["
+ Regex.Escape(System.IO.Path.InvalidPathChars) + "]");
if (containsABadCharacter.IsMatch(testName) { return false; };
// other checks for UNC, drive-path format, etc
return true;
}
Pour .Net Cadres après 3,0 cela devrait fonctionner:
http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars(v=vs. 90).aspx
Expression régulière correspondant devrait vous obtenir un bout de chemin. Voici un morceau de code à l'aide de l' System.IO.Path.GetInvalidPathChars()
constante;
bool IsValidFilename(string testName)
{
Regex containsABadCharacter = new Regex("["
+ Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]");
if (containsABadCharacter.IsMatch(testName) { return false; };
// other checks for UNC, drive-path format, etc
return true;
}
Une fois que vous savez cela, vous devriez également vérifier pour les différents formats, par exemple, c:\my\drive
et \\server\share\dir\file.ext