В моем приложении пользователь может ввести имя файла. Перед обработкой я хотел бы проверить, является ли входная строка допустимым именем файла в Windows Vista.
Как это сделать проще всего?
По закону я обращаюсь к легальным и несуществующим
В моем приложении пользователь может ввести имя файла. Перед обработкой я хотел бы проверить, является ли входная строка допустимым именем файла в Windows Vista.
Как это сделать проще всего?
По закону я обращаюсь к легальным и несуществующим
Ответы:
Проверить, есть ли filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
и!File.Exists(Path.Combine(someFolder, filename))
"http://www.microsoft.com/"
прошел тест, но имя файла недействительно, то же самое для"::::"
Проверить против GetInvalidFileNameChars()
:
var isValid = !string.IsNullOrEmpty(fileName) &&
fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
!File.Exists(Path.Combine(sourceFolder, fileName));
"http://www.microsoft.com/"
прошел тест, но имя файла недействительно, то же самое для"::::"
::::
ошибочно считалось действительным. Я исправил ответ, указав < 0
вместо == 0
.
GetInvalidFileNameChars
, а не GetInvalidPathChars
SLaks. Если это проверка только имени файла, а не имени файла с путем, все будет в порядке.
GetInvalidFileNameChars
:-)
Если файл будет создан, вы должны использовать диалоговое окно файла, чтобы указать путь к каталогу. Вот небольшой список недопустимых символов в именах файлов.
Единственный по-настоящему надежный способ определить, приемлемо ли имя файла, - это попробовать его. Разрешения - это болото.
Я использую это:
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;
}
Следует позаботиться обо всем, кроме зарезервированных имен, разрешений и ограничений длины. Это принимает как относительные, так и абсолютные имена файлов.
Это просто идея. Следует заполнить список исключений:
public static bool IsValidFilename(string filename)
{
try
{
File.OpenRead(filename).Close();
}
catch (ArgumentException) { return false; }
catch (Exception) { }
return true;
}