In meiner Anwendung kann der Benutzer einen Dateinamen eingeben. Vor der Verarbeitung möchte ich überprüfen, ob die Eingabezeichenfolge unter Windows Vista ein gültiger Dateiname ist.
Was ist der einfachste Weg, das zu tun?
Mit gültig beziehe ich mich auf legal und nicht existent
Antworten:
Überprüfen Sie, ob
filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
und!File.Exists(Path.Combine(someFolder, filename))
quelle
"http://www.microsoft.com/"
Besteht Ihren Test, ist aber kein gültiger Dateiname, ebenso für"::::"
Prüfen Sie gegen
GetInvalidFileNameChars()
:var isValid = !string.IsNullOrEmpty(fileName) && fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && !File.Exists(Path.Combine(sourceFolder, fileName));
quelle
"http://www.microsoft.com/"
Besteht Ihren Test, ist aber kein gültiger Dateiname, ebenso für"::::"
::::
wurde fälschlicherweise als gültig angesehen. Ich habe die Antwort korrigiert, um< 0
statt anzuzeigen== 0
.GetInvalidFileNameChars
, nichtGetInvalidPathChars
wie SLaks. Solange es sich nur um einen Test für den Dateinamen und nicht um einen Dateinamen mit Pfad handelt, ist dies in Ordnung.GetInvalidFileNameChars
:-)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, ihn auszuprobieren. Berechtigungen sind ein Morast.
quelle
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 kümmern, außer um reservierte Namen, Berechtigungen und Längenbeschränkungen. Dies akzeptiert sowohl relative als auch absolute Dateinamen.
quelle
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; }
quelle