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 的路径都将被规范化,规范化将执行下面的操作:
  1. 规范化目录分隔符
  2. 应用当前目录到相对路径
  3. 评估相对目录组件(当前,父…)
  4. 修剪特定的字符

确认目录

确认路径的类型是第一件要做的事情,路径将最终落实到以下类型之一:

  1. 以一个 “” 开头
  2. \? 或者 \. 开头
  3. \非?或. (UNC 路径)
  4. c:\开头
  5. c:
  6. 旧版设备CON,LPT1 等(设备)
  7. 其他类型开始(相对于当前目录)

旧版设备

如果是一个旧版的设备,比如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()并进行规范化。 有一个重要的例外-如果您的设备路径以问号而不是句点开头。 它必须使用规范的反斜杠-如果路径不是以\?\开头,它将被规范化。

  1. 访问合法,但是可能被错误格式化的路径,比如C:\too. ,正常操作将无法访问该文件按,
  2. 跳过对MAX_PATH 的检查
  3. 如果将\?\开头的路径传递给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
太过优秀,建议看原文

未完待续

发布了93 篇原创文章 · 获赞 13 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/101732115
今日推荐