Самый простой способ проверить, является ли произвольная строка допустимым именем файла - PullRequest
66 голосов
/ 10 января 2011

В моем приложении пользователь может ввести имя файла.Перед обработкой я хотел бы проверить, является ли введенная строка допустимым именем файла в Windows Vista.

Какой самый простой способ сделать это?-existing

Ответы [ 5 ]

111 голосов
/ 10 января 2011

Проверьте, есть ли filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0 и !File.Exists(Path.Combine(someFolder, filename))

29 голосов
/ 10 января 2011

Проверка против GetInvalidFileNameChars():

var isValid = !string.IsNullOrEmpty(fileName) &&
              fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
              !File.Exists(Path.Combine(sourceFolder, fileName));
12 голосов
/ 10 января 2011

Если файл будет создан, вы должны использовать диалоговое окно файла, чтобы указать путь к каталогу.Есть короткий список недопустимых символов для имен файлов.

Единственный действительно надежный способ определить, является ли имя файла приемлемым, - это попробовать его.Разрешения это болото.

1 голос
/ 16 октября 2017

Я использую это:

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

Должен позаботиться обо всем, кроме зарезервированных имен, разрешений и ограничений длины.Это принимает как относительные, так и абсолютные имена файлов.

0 голосов
/ 31 мая 2018

Это всего лишь идея.Нужно заполнить список исключений:

public static bool IsValidFilename(string filename)
{
    try
    {
        File.OpenRead(filename).Close();
    }
    catch (ArgumentException) { return false; }
    catch (Exception) { }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...