W mojej aplikacji użytkownik może wprowadzić nazwę pliku. Przed przetwarzaniem chciałbym sprawdzić, czy ciąg wejściowy jest prawidłową nazwą pliku w systemie Windows Vista.
Jaki jest najłatwiejszy sposób na zrobienie tego?
Przez prawidłowe odnoszę się do legalnych i nieistniejących
Odpowiedzi:
Sprawdź, czy
filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
i!File.Exists(Path.Combine(someFolder, filename))
źródło
"http://www.microsoft.com/"
zdaje test, ale nie jest prawidłową nazwą pliku, tak samo jak"::::"
< 0
zamiast>= 0
jakIndexOfAny()
zwróci -1, jeśli nic nie zostanie znalezioneSprawdź przeciwko
GetInvalidFileNameChars()
:var isValid = !string.IsNullOrEmpty(fileName) && fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && !File.Exists(Path.Combine(sourceFolder, fileName));
źródło
"http://www.microsoft.com/"
zdaje test, ale nie jest prawidłową nazwą pliku, tak samo jak"::::"
::::
została błędnie uznana za ważną. Poprawiłem odpowiedź, aby wskazać< 0
zamiast== 0
.GetInvalidFileNameChars
, a nieGetInvalidPathChars
SLaksów. Tak długo, jak jest to test tylko dla nazwy pliku, a nie nazwy pliku ze ścieżką, wszystko będzie w porządku.GetInvalidFileNameChars
:-)Jeśli plik ma zostać utworzony, należy użyć okna dialogowego pliku, aby określić ścieżkę do katalogu. Istnieje krótka lista niedozwolonych znaków w nazwach plików.
Jedynym naprawdę niezawodnym sposobem sprawdzenia, czy nazwa pliku jest akceptowalna, jest wypróbowanie jej. Pozwolenia to grzęzawisko.
źródło
Używam tego:
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; }
Powinien zająć się wszystkim oprócz zastrzeżonych nazw, uprawnień i ograniczeń długości. Akceptuje zarówno względne, jak i bezwzględne nazwy plików.
źródło
To tylko pomysł. Listę wyjątków należy wypełnić:
public static bool IsValidFilename(string filename) { try { File.OpenRead(filename).Close(); } catch (ArgumentException) { return false; } catch (Exception) { } return true; }
źródło