web-dev-qa-db-fra.com

Meilleure façon de vérifier si une chaîne arbitraire est un nom de fichier valide

Dans mon application, l'utilisateur peut entrer un nom de fichier. Avant de commencer, j'aimerais vérifier si la chaîne d'entrée est un nom de fichier valide sous Windows Vista.

Quel est le moyen le plus simple de le faire?

Par valide je me réfère à légal et non existant

59
RoflcoptrException

Vérifiez si filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0 et !File.Exists(Path.Combine(someFolder, filename))

107
SLaks

Vérifier contre GetInvalidFileNameChars():

var isValid = !string.IsNullOrEmpty(fileName) &&
              fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
              !File.Exists(Path.Combine(sourceFolder, fileName));
29
Phil Hunt

Si le fichier doit être créé, vous devez utiliser une boîte de dialogue de fichier pour spécifier le chemin du répertoire. Il existe une courte liste de caractères illégaux pour les noms de fichiers.

Le seul moyen réellement fiable de déterminer si un nom de fichier est acceptable est de l'essayer. Autorisations est un bourbier.

12
ddyer

J'utilise ceci:

public static bool IsValidFileName(string name) {
    if(string.IsNullOrWhiteSpace(name)) return false;
    if(name.Length > 1 && name[1] == ':') {
        if(name.Length < 4 || name.ToLower()[0] < 'a' || name.ToLower()[0] > 'z' || name[2] != '\\') return false;
        name = name.Substring(3);
    }
    if(name.StartsWith("\\\\")) name = name.Substring(1);
    if(name.EndsWith("\\") || !name.Trim().Equals(name) || name.Contains("\\\\") ||
        name.IndexOfAny(Path.GetInvalidFileNameChars().Where(x=>x!='\\').ToArray()) >= 0) return false;
    return true;
}

Devrait s'occuper de tout sauf des noms réservés, des autorisations et des restrictions de longueur. Cela accepte les noms de fichiers relatifs et absolus.

1
Duke Nukem

Ceci est juste une idée. Il faut renseigner la liste des exceptions:

public static bool IsValidFilename(string filename)
{
    try
    {
        File.OpenRead(filename).Close();
    }
    catch (ArgumentException) { return false; }
    catch (Exception) { }
    return true;
}
0
Bitterblue