it-swarm.com.de

Am einfachsten überprüfen Sie, ob ein beliebiger String ein gültiger Dateiname ist

In meiner Anwendung kann der Benutzer einen Dateinamen eingeben. Vor der Verarbeitung möchte ich prüfen, ob die Eingabezeichenfolge unter Windows Vista ein gültiger Dateiname ist.

Was ist der einfachste Weg, das zu tun?

Mit Gültigkeit beziehe ich mich auf legale und nicht existierende

59

Prüfen Sie, ob filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0 und !File.Exists(Path.Combine(someFolder, filename))

107
SLaks

Gegen GetInvalidFileNameChars() prüfen:

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

Wenn die Datei erstellt werden soll, sollten Sie einen Dateidialog verwenden, um den Verzeichnispfad anzugeben. Es gibt eine kurze Liste unzulässiger Zeichen für Dateinamen.

Der einzig wirklich zuverlässige Weg, um festzustellen, ob ein Dateiname akzeptabel ist, besteht darin, es auszuprobieren. Permissionsist ein Morast.

12
ddyer

Ich benutze das:

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;
}

Sollte sich um alles außer reservierten Namen, Berechtigungen und Längenbeschränkungen kümmern. Dies akzeptiert sowohl relative als auch absolute Dateinamen.

1
Duke Nukem

Dies ist nur eine Idee. Man sollte die Ausnahmeliste füllen:

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