Регулярные выражения в C# для проверки имени файла
Что такое хорошее регулярное выражение, которое может проверять текстовую строку, чтобы убедиться, что это допустимое имя файла Windows? (Ака не имею \/:*?"<>|
персонажи).
Я хотел бы использовать его следующим образом:
// Return true if string is invalid.
if (Regex.IsMatch(szFileName, "<your regex string>"))
{
// Tell user to reformat their filename.
}
4 ответа
Как уже было сказано, GetInvalidFileNameChars должен сделать это за вас, и вам даже не нужны служебные данные регулярных выражений:
if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
MessageBox.Show("The filename is invalid");
return;
}
Это не так просто, как просто проверить, содержит ли имя файла какой-либо из System.IO.Path.GetInvalidFileNameChars (как уже упоминалось в нескольких других ответах).
Например, что если кто-то введет имя, которое не содержит недопустимых символов, но имеет длину 300 символов (то есть больше, чем MAX_PATH) - это не будет работать ни с одним из файловых API-интерфейсов.NET, а имеет ограниченную поддержку в остальных окнах, используя синтаксис \?\ path. Вам нужен контекст, чтобы определить, как долго будет длиться имя файла. Вы можете найти больше информации об этом типе вещей здесь.
В конечном итоге все ваши проверки могут надежно доказать, что имя файла является недействительным, или дать вам разумную оценку того, является ли оно действительным. Фактически невозможно доказать, что имя файла является действительным, даже не пытаясь его использовать. (И даже тогда у вас возникают проблемы, например, что, если оно уже существует? Это может быть допустимое имя файла, но допустимо ли в вашем сценарии иметь повторяющееся имя?)
Path.GetInvalidFileNameChars - не очень хороший способ. Попробуй это:
if(@"C:\A.txt".IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
MessageBox.Show("The filename is invalid");
return;
}
Почему бы не использовать класс System.IO.FileInfo, вместе с классом DirectoryInfo у вас есть набор полезных методов.