如何以编程方式(c#)验证国际文化(如中文)的驱动器号?

如何以编程方式(c#)验证国际文化(如中文)的驱动器号?,c#,.net,windows,validation,internationalization,C#,.net,Windows,Validation,Internationalization,背景: 我试图验证一条可能并不存在的路径。因此,我无法使用“Directory.Exists()”方法验证它。另外,代码可能在不同的机器上运行。我只想知道什么是有效的,什么是无效的。我研究发现,这比我最初想象的要复杂得多。如果微软给出了一种解决方法,事情会简单得多 我很快意识到,Path.GetInvalidPathChars()和Path.GetInvalidFileNameChars()等方法的价值非常有限。如果使用GetInvalidPathChars()进行验证,则允许使用“*”和“?”

背景:

我试图验证一条可能并不存在的路径。因此,我无法使用“Directory.Exists()”方法验证它。另外,代码可能在不同的机器上运行。我只想知道什么是有效的,什么是无效的。我研究发现,这比我最初想象的要复杂得多。如果微软给出了一种解决方法,事情会简单得多

我很快意识到,Path.GetInvalidPathChars()和Path.GetInvalidFileNameChars()等方法的价值非常有限。如果使用GetInvalidPathChars()进行验证,则允许使用“*”和“?”等字母,这些字母实际上作为目录名或文件名无效。GetInvalidFileNameChars()是一个更好的选项。但是,它不允许冒号(“:”),只有当它紧跟在驱动器号之后时,冒号才是有效字符。此外,很少有其他规则规定文件夹名称不能将所有字符都作为点('.')。类似地,目录不能有一些保留字,如LPT1到LPT9或COM1到COM9。此处记录了完整的规则列表:

因此,为了验证路径,我将路径分为两部分-

  • 使用Path.GetPathRoot()方法创建根部件,并分别进行验证
  • 剩下的路径-使用path.directorysepartorchar进一步分割,然后我使用复杂算法分别验证每个目录名。(完成后,我将稍后发布该代码)
主要问题


我想通过检查驱动器号是否有效来验证根路径。我知道在英国文化方面,你只能从A:开车到Z:开车。但是,我如何才能在中国或日本等国际文化中验证这一点呢?我找不到任何有关德国或中国机器的有效驱动器号列表的文档。这些系统是否允许其他Unicode字符作为驱动器号

很简单:A-Z是唯一有效的驱动器号,不管文化是什么。 但是您当然可以有一个没有驱动器号的路径

通常,在处理路径名时,不需要担心区域性。文件夹使用Unicode,所有用户都可以访问该文件夹,而不考虑区域设置

但是还有很多其他非常大的问题需要解决

我想说:这是不可能的。 一个完整的解释对于一个答案来说太重要了。 但是想想看:我可能有一个映射到驱动器号的网络共享。这可能是与Samba共享的Linux或Mac文件夹。因此,您必须考虑这些操作系统的所有限制、该机器上的确切文件系统以及共享协议的限制。 或者想想共享FAT32文件系统的Windows计算机。甚至是FAT16,它不支持Unicode,也不支持长文件名

甚至对于本地驱动器,也存在许多其他问题。
但是,正如我所说,这个答案太难了。

您是否尝试过使用文化不变性搜索字符串?我以前用希伯来文和阿拉伯文做过一些正则表达式,IIRC对我有用。你为什么不问问文件系统呢?换句话说:不要试图提前验证任何东西。只需按原样使用路径即可。当输入错误时,I/O API会让您知道。不管怎样,你已经知道你主要问题的答案了。驱动器号是从DOS遗留下来的一个工件。DOS早于Unicode。(请记住,您无需使用驱动器号即可引用卷。)谢谢。你已经回答了我关于驱动器号的主要问题。至于没有驱动器号的路径,如-“\\ServerName\ShareName\folder”-我将分别验证。我的假设很简单——网络上服务器的操作系统并不重要。我的应用程序仅在Windows上运行,任何路径都将始终以Microsoft允许的格式显示为路径。我不太担心非Microsoft平台或隐藏驱动器上的其他限制,因为对于我的典型需求,它们是边界情况,即使验证不支持1%的限制,也可以。任何路径都将始终以Microsoft允许的格式显示为路径:“true”。但底层技术可能只支持windows功能的一部分。即使是纯Windows,如果本地磁盘是FAT16(作为极端情况),那么它也不支持Unicode。因此,您的代码可能会说带有希腊字符的路径是有效的,但文件系统不允许这样做。所以它失败了。边缘案例,没错。但知道这些限制总是好的。例如“NTFS,仅本地磁盘”(尽管即使在那里也有一些陷阱):-)