Самый простой способ проверить, является ли произвольная строка допустимым именем файла


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

что самый простой способ сделать это?

по валидности я отношусь к легальным и несуществующим

5 56

5 ответов:

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

проверки в отношении GetInvalidFileNameChars():

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

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

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

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

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