Ответ 1
Убедитесь, что filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
и !File.Exists(Path.Combine(someFolder, filename))
В моем приложении пользователь может ввести имя файла. Перед обработкой я хотел бы проверить, является ли входная строка корректным именем файла в Windows Vista.
Самый простой способ сделать это?
В действительности я возвращаюсь к юридическим и несуществующим
Убедитесь, что 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;
}
Следует заботиться обо всех, кроме зарезервированных имен, разрешений и ограничений длины. Это принимает как относительные, так и абсолютные имена файлов.