windows path
原文
https://blogs.msdn.microsoft.com/jeremykuhne/2016/04/21/path-format-overview/
概述
- dos path
c:\test\Foo.txt - UNC path
\Server\share\Test\Foo.txt - DOS Device Path
Windows NT 有一个统一对象模型,其可以表示所有的资源,包括文件。这些NT 对象路径无法直接通过windows API(因此CMD Shell 和 explorer 也无法访问)。它们以通过旧版DOS 和 UNC 路径映射到的符号链接的特殊文件夹暴露给win 32 层。
\.\c:\Test\Too.txt
\?\c:\Test\Foo.txt
\.\UNC\C:\Test\Too.txt
\?\UNC\C:\Test\Too.txt
\.\UNC\Server\Share
\?\UNC\Server\Share
path 规范化
- 基本上所有被传递给windows api 的路径都将被规范化,规范化将执行下面的操作:
- 规范化目录分隔符
- 应用当前目录到相对路径
- 评估相对目录组件(当前,父…)
- 修剪特定的字符
确认目录
确认路径的类型是第一件要做的事情,路径将最终落实到以下类型之一:
- 以一个 “” 开头
- \? 或者 \. 开头
- \非?或. (UNC 路径)
- c:\开头
- c:
- 旧版设备CON,LPT1 等(设备)
- 其他类型开始(相对于当前目录)
旧版设备
如果是一个旧版的设备,比如CON,COM1,LPT1 等,将在前面加\.\,然后返回
应用当前目录
非全路径,就需要当前路径。对应上面的1,5,7.UNC 是一个设备路径,不可以应用相对路径
对应1,\开始,表示应用当前目录的根目录,比如\bar,当前目录为c:\foo\,将得到C:\bar
对应5,c:,command shell 指定的对应的盘符的最新的当前目录将被使用。或者根盘符自己。使用,d:bar,当前目录为c:\foo\,d盘的当前目录为d:\bar\ 你将得到d:\bar\bar。
对应7。如果你传入bar,当前目录是c:\foo\,你可能得到c:\foo\bar
相对路径在多线程环境下是危险的,因为当前路径是一个进程范围的设置。
规范化分隔符
/ 被替换成 \。双\ 被替换为\(如果前面有两个\,是不被替换的)
规范化中,初始的斜杠的方向对于标识目录的类型不重要。但是,在此归一化步骤之外,windows 不支持前斜杠。这对于跳过规范化至关重要
评估相对组件
在处理路径时,将评估由一个或两个周期组成的任何组件/段。对于".",当前段将被删除(因为这意味着当前目录)。对于"…",当前目录和其父目录将被删除。父目录仅仅在不超过路径的根时才被删除。路径的根取决于路径的类型。它是DOS 路径的驱动器(c:\),是UNC 的服务器/共享(\Server\Share),并且是设备路径的设备路径前缀\?\,或\.\
修剪字符
如果某段在单个"."内结束,则该期间将被删除。 .或…的段属于上述相对成分规则。 三个句段(或更多个句段)不会符合任何这些规则,实际上是有效的文件/目录名称。 如果路径不是以分隔符结尾,则所有尾随句点和空格(仅字符代码32)将被删除。 如果最后一个段只是一个单周期或双周期,则属于上面的相对成分规则。
跳过格式化
通常,传递给Windows API的任何路径都(有效)传递给GetFullPathName()并进行规范化。 有一个重要的例外-如果您的设备路径以问号而不是句点开头。 它必须使用规范的反斜杠-如果路径不是以\?\开头,它将被规范化。
- 访问合法,但是可能被错误格式化的路径,比如C:\too. ,正常操作将无法访问该文件按,
- 跳过对MAX_PATH 的检查
- 如果将\?\开头的路径传递给GetFullPathName ,它也将被格式化。
DOS to NT ,一个路径的旅程
“Real" Path
windows NT 内部使用的NT path,Windows Object Manager 管理的资源的路径。对象管理器处理对象的创建、销毁和访问权限。资源包括文件、注册表键、线程、进程、设备、mutexes 等等
文件的NT path,比如对一个c:\bar\foo.txt ,对应了\Device\HardiskVolume4\bar\foo.txt。
\Device\HardiskVolume4\ 是通过符号链接c: 暴露给win32 的设备对象。该设备对象是Object Manager 解析路径的地方。路径剩下的地方:\bar\foo.txt ,被移交给i/O 管理器和相关的驱动程序,以进行进一步的解析和对象创建。
一个路径的生命周期
命令c:\bar > echo foo > foo.txt
太过优秀,建议看原文
未完待续