2012-10-29 489 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/"下。)