Подтвердить что ты не робот

Регулярные выражения в С# для проверки имени файла

Что такое хорошее регулярное выражение, которое может проверять текстовую строку, чтобы убедиться, что это допустимое имя файла Windows? (AKA не имеет символов \/:*?"<>|).

Я хотел бы использовать его, как показано ниже:

// Return true if string is invalid.
if (Regex.IsMatch(szFileName, "<your regex string>"))
{
    // Tell user to reformat their filename.
}
4b9b3361

Ответ 1

Как уже было сказано, GetInvalidFileNameChars должен сделать это за вас, и вам даже не нужны служебные данные регулярных выражений:

if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
  MessageBox.Show("The filename is invalid");
  return;
}

Ответ 2

Это не так просто, как просто проверить, содержит ли имя файла System.IO.Path.GetInvalidFileNameChars (как упоминалось в нескольких других ответах уже есть).

Например, если кто-то вводит имя, которое не содержит недопустимых символов, но имеет длину 300 символов (то есть больше MAX_PATH) - это не сработает ни с одним из API-интерфейсов .NET и имеет ограниченную поддержку в остальном окон с использованием синтаксиса \?\path. Вам нужен контекст относительно того, как долго остальная часть пути определяет, как долго может быть имя файла. Вы можете найти дополнительную информацию об этом типе вещей.

В конечном счете, все ваши проверки могут быть достоверно доказаны, что имя файла недействительно или дает вам разумную оценку того, действительно ли он действителен. Практически невозможно доказать, что имя файла действительно без фактического использования. (И даже тогда у вас есть проблемы вроде того, что, если он уже существует? Может быть допустимым именем файла, но действительно ли в вашем сценарии иметь дублирующее имя?)

Ответ 3

Почему бы не использовать класс System.IO.FileInfo вместе с классом DirectoryInfo, у вас есть набор полезных методов.

Ответ 4

Path.GetInvalidFileNameChars - Не лучший способ. Попробуйте следующее:

if(@"C:\A.txt".IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
  MessageBox.Show("The filename is invalid");
  return;
}