179 votes

Comment vérifier si la chaîne donnée est nom de fichier (autorisés) juridique sous Windows ?

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 ?

139voto

user7116 Points 39829

À 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)

102voto

Eugene Katz Points 2784

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.

69voto

Steve Cooper Points 6637

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

23voto

Scott Dorman Points 25000

C’est ce que j’utilise :

Le premier modèle crée une expression régulière contenant les noms de fichier non valide ou illégales et les personnages pour les plates-formes Windows uniquement. Le deuxième fait la même chose mais fait en sorte que le nom est légal pour n’importe quelle plateforme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X