2008-09-19 6 views
19

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

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

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

ответ

48

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

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

простая правая скобка помещается в сообщение if, но удивительное спасибо! – Balk 2008-09-19 06:47:55

+7

Значит, «C ::::::::» является допустимым именем? – Andrew 2010-02-18 20:25:50

0

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

6

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

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

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

0

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

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