Регулярные выражения в C # для проверки имени файла - PullRequest
19 голосов
/ 19 сентября 2008

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

Я бы хотел использовать его следующим образом:

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

Ответы [ 4 ]

48 голосов
/ 19 сентября 2008

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

if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
  MessageBox.Show("The filename is invalid");
  return;
}
6 голосов
/ 19 сентября 2008

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

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

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

0 голосов
/ 10 декабря 2008

Path.GetInvalidFileNameChars - не очень хороший способ. Попробуйте это:

if(@"C:\A.txt".IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
  MessageBox.Show("The filename is invalid");
  return;
}
0 голосов
/ 19 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...