2012-10-29 493 views
0

我想使用正則表達式來驗證給定的文件夾名稱,我嘗試了一些測試,它工作正常,請讓我知道如果我是完全安全的或我reg表達式錯過東西:有效的文件夾名稱正則表達式C++(windows)

QRegExp regExp("^([a-zA-Z])(([a-zA-Z_\-\s0-9\.\)\(])([^\\[email protected]#$%^&/:*?<>""|]*))*$"); 
     QStringList ForbidenNameU; 
     ForbidenNameU<<"CON"<<"PRN"<<"AUX"<<"NUL"<<"COM"<<"COM1"<<"COM2"<<"COM3"<<"COM4"<<"COM5"<<"COM6"<<"COM7"<<"COM8"<<"COM9"<<"LPT"<<"LPT1"<<"LPT2"<<"LPT3"<<"LPT4"<<"LPT5"<<"LPT6"<<"LPT7"<<"LPT8"<<"LPT9"; 
     QStringList ForbidenName; 
     ForbidenName<<"con"<<"prn"<<"aux"<<"nul"<<"com"<<"com1"<<"com2"<<"com3"<<"com4"<<"com5"<<"com6"<<"com7"<<"com8"<<"com9"<<"lpt"<<"lpt1"<<"lpt2"<<"lpt3"<<"lpt4"<<"lpt5"<<"lpt6"<<"lpt7"<<"lpt8"<<"lpt9"; 

     if((Dirname->text().contains(regExp))&& !ForbidenNameU.contains(Dirname->text())&& !ForbidenName.contains(Dirname->text())) 
     { 
      validname=true; 
      qDebug()<<"match in dir name = "<<regExp.cap(0); 
      emit completeChanged(); 
     }... 

PS(我不想用GetInvalidFileNameChars()或任何其他API)

預先感謝您。

+0

哪個平臺? – Andrey

+3

你忘記了混合大小寫的名字;而在UNC路徑中,所有這些名稱實際上並未被禁止。但是總的來說,IMO這些檢查是無用的複雜功能 - 只是嘗試創建/打開/ ...目錄並準備好處理故障(因爲IO總是可能會失敗)。 –

+0

[在Windows下如何檢查給定字符串是否合法(允許)文件名?](http://stackoverflow.com/questions/62771/how-check-if-given-string-is-legal-allowed-文件名下的窗口) – Andrey

回答

4

在Windows environmnent:

^(?!(?:CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\.[^.]*)?$)[^<>:"/\\|?*\x00-\x1F]*[^<>:"/\\|?*\x00-\x1F\ .]$ 

與CASE_INSENSITIVE和UNICODE_CASE修飾。


^        # Anchor to start of string.   
(?!        # Assert filename is not: CON, PRN, 
    (?:       # AUX, NUL, COM1, COM2, COM3, COM4, 
    CON|PRN|AUX|NUL|    # COM5, COM6, COM7, COM8, COM9,  
    COM[1-9]|LPT[1-9]   # LPT1, LPT2, LPT3, LPT4, LPT5,  
)        # LPT6, LPT7, LPT8, and LPT9...  
    (?:\.[^.]*)?     # followed by optional extension  
    $        # and end of string.     
)        # End negative lookahead assertion. 
[^<>:"/\\|?*\x00-\x1F]*   # Zero or more valid filename chars. 
[^<>:"/\\|?*\x00-\x1F\ .]  # Last char is not a space or dot. 
$        # Anchor to end of string.   
+0

如果您處於僅限Windows的環境中,那麼唯一合理的解決方案是使用Windows特定的環境。 (當然,如果你擔心的只有Windows和Unix,Unix將接受幾乎所有的Windows作爲目錄名稱。) –

+0

是的,在一個僅限於Windows的環境中,所以它會更容易嘗試創建文件夾,處理返回的錯誤? – Oumaya

+0

@oumaya - 您可以使用上述正則表達式作爲預驗證,但當然您也需要處理錯誤。 –

0

這當然是錯誤的一些系統,如什麼是有效的目錄名 將依賴於系統,甚至可能是實際的文件SY幹: 遠程安裝的文件系統通常會服從文件系統主機的約定爲 ,而不是本地系統。

面對此,有兩種解決方案,具體取決於您想要解決的實際問題 。最簡單的方法就是嘗試創建文件 ,並檢查返回的錯誤。這將使您快速和容易地檢查名稱在當前環境中是否合法。如果 需要創建一個層次結構,然後可以在任何地方讀取,但是, 最好的解決方案是採取非常保守的方法,只允許 字母數字字符和'_',或者可能甚至只有小寫字母 和數字(以避免任何意外創建兩個目錄的風險 其名稱僅在大小寫不同的情況下)。您可能還想限制 的長度。 (歷史上,已經有系統只允許六個字符,但現在聽起來有點過分。)

關於禁止的名字:這也是非常依賴系統的, 並且可能取決於目錄的位置正在創建。 ( 在Unix下沒有保留的名字,但是你幾乎可以肯定要 會遇到麻煩,如果你嘗試在特定的 目錄中使用某些名字:"local"一般都很好,但我不會嘗試創建 它在"/usr/"下。)