У моїй програмі користувач може ввести ім'я файлу. Перед обробкою я хотів би перевірити, чи є вхідний рядок дійсним іменем файлу в 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;
}