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
Vérifiez si filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
et !File.Exists(Path.Combine(someFolder, filename))
Vérifier contre GetInvalidFileNameChars()
:
var isValid = !string.IsNullOrEmpty(fileName) &&
fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
!File.Exists(Path.Combine(sourceFolder, fileName));
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.
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.
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;
}