2008-09-19 387 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)的名稱 - 這將不適用於任何.NET文件API,並且只有有限的支持其餘的窗口使用\?\路徑語法。您需要上下文來確定剩餘路徑的多長時間來確定文件名可以存在多長時間。你可以找到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; 
}