129 votes

En C#, vérifiez que le nom de fichier est *possible* d'être valide (et non qu'il existe).

Existe-t-il une méthode dans l'espace de noms System.IO qui vérifie la validité d'un nom de fichier ?

Par exemple, C:\foo\bar validerait et :"~-* ne serait pas

Ou un peu plus délicat, X:\foo\bar validerait s'il y a un X: sur le système, mais ne le ferait pas autrement.

Je suppose que je pourrais écrire moi-même une telle méthode, mais je suis plus intéressé par une méthode intégrée.

95voto

Rüdiger Stevens Points 5381

Fais-le.

bool bOk = false;
try
{
  new System.IO.FileInfo(fileName);
  bOk = true;
}
catch (ArgumentException) { }
catch (System.IO.PathTooLongException) { }
catch (NotSupportedException) { }
if (!bOk)
{
  ...
}
else
{
  ...
}

Pour créer un FileInfo instance, le fichier ne doit pas nécessairement exister.

Vous pouvez ensuite faire FileInfo.Exists pour vérifier si le fichier existe ou non.

37voto

Eugene Katz Points 2784

Vous pouvez obtenir une liste des caractères invalides à partir de Chemin.GetInvalidPathChars et GetInvalidFileNameChars tel que discuté dans cette question.

Comme l'a fait remarquer jberger, il existe d'autres caractères qui ne sont pas inclus dans la réponse de cette méthode. Pour plus de détails sur la plate-forme Windows, consultez le site Nommer les fichiers, les chemins et les espaces de noms sur MSDN,

Comme Micah souligne il y a Directory.GetLogicalDrives pour obtenir une liste des lecteurs valides.

19voto

LamdaComplex Points 306

Vous pouvez utiliser la classe System.Uri. La classe Uri n'est pas seulement utile pour les URL Web, elle gère également les chemins des systèmes de fichiers. Utilisez la méthode Uri.TryCreate pour savoir si le chemin est enraciné, puis utilisez la propriété IsLoopback pour déterminer si l'Uri fait référence à la machine locale.

Voici une méthode simple qui détermine si une chaîne est un chemin de fichier valide, local et enraciné.

public bool IsPathValidRootedLocal(String pathString)
{
    Uri pathUri;
    Boolean isValidUri = Uri.TryCreate(pathString, UriKind.Absolute, out pathUri);

    return isValidUri && pathUri != null && pathUri.IsLoopback;
}

Je suis sûr que ça va marcher.

9voto

Micah Points 28683

Il y a plusieurs méthodes que vous pouvez utiliser qui existent dans le System.IO espace de noms :

Directory.GetLogicalDrives() // Returns an array of strings like "c:\"
Path.GetInvalidFileNameChars() // Returns an array of characters that cannot be used in a file name
Path.GetInvalidPathChars() // Returns an array of characters that cannot be used in a path.

Comme suggéré, vous pourriez alors faire ceci :

bool IsValidFilename(string testName)
{
    string regexString = "[" + Regex.Escape(Path.GetInvalidPathChars()) + "]";
    Regex containsABadCharacter = new Regex(regexString);

    if (containsABadCharacter.IsMatch(testName))
    {
        return false;
    }

    // Check for drive
    string pathRoot = Path.GetPathRoot(testName);
    if (Directory.GetLogicalDrives().Contains(pathRoot))
    {
        // etc
    }

    // other checks for UNC, drive-path format, etc

    return true;
}

6voto

Michael Haren Points 42641

Même si le nom du fichier est valide, vous pouvez toujours vouloir touch pour s'assurer que l'utilisateur a le droit d'écrire.

Si vous n'avez pas l'intention d'écraser le disque avec des centaines de fichiers dans un court laps de temps, je pense que la création d'un fichier vide est une approche raisonnable.

Si vous voulez vraiment quelque chose de plus léger, comme la vérification des caractères non valides, comparez votre nom de fichier à Path.GetInvalidFileNameChars().

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