知识点

目录树与路径

定义

目录树

文件系统是操作系统中负责管理持久化数据的子系统,它把存储设备上的数据组织成文件和目录,让程序不必关心数据落在哪个扇区。许多系统将路径组织成以目录为节点的层次结构:

  • 根目录是树的起点。Windows中通常是盘符(如C:\),Unix/Linux中是 /。
  • 目录是可以包含文件和其他目录的容器。
  • 文件是存储数据的基本单元。
  • 路径是定位文件的地址。
一个目录树
C:\ (根)
├── Windows/
├── Program Files/
└── Users/
└── Alice/
├── Documents/
│ ├── PythonProjects/
│ │ ├── ProjectA/
│ │ │ └── main.py
│ │ └── DataAnalysis/
│ │ └── data.csv
└── Downloads/

Windows为每个盘符建立一棵独立的树,所以一台机器可以有多个根;Unix只在 / 处有一棵树,其他设备通过挂载接到树上。这个差别决定了路径怎么写,但两种系统里的目录都是树的节点。

路径

路径由沿途的目录名和最后的文件名拼成,分为两种:

类型起点例子
绝对路径根目录C:\Users\Alice\Documents\file.txt
相对路径当前工作目录./DataAnalysis/data.csv

. 表示当前目录,.. 表示父目录。分隔符随系统不同:Windows用反斜杠 \,Unix用斜杠 /。在Python字符串里写Windows路径时,反斜杠要转义,或者改用原始字符串。

相对路径的起点是进程的当前工作目录,不是脚本文件所在的目录。同一个相对路径,从不同目录启动、或运行中切换了工作目录,就可能指向不同甚至不存在的文件。需要稳定定位时用绝对路径,或先根据脚本位置构造路径。

访问权限

名字之外,文件系统还为每个对象记录访问控制信息。Unix风格系统常用所有者、所属组和其他用户的读、写、执行权限位,也可能结合访问控制列表等机制。目录上的这三种权限含义与普通文件不同:

权限对文件对目录
读读取内容列出目录中的条目
写修改内容在目录中增删条目
执行作为程序运行进入该目录并访问其下的文件

Windows用访问控制列表(ACL)逐条记录允许和拒绝,概念上同样是“谁能对哪个对象做什么”。

打开文件时,模式说明这次要做什么,权限决定进程是否被允许这样做。因此打开失败不一定代表路径写错:文件不存在、路径中某一级目录不可进入、文件没有相应权限,都会让打开操作失败,区别只在错误码和异常类型。

例子

相对路径随工作目录改变

设当前工作目录是C:\Users\Alice\Documents。相对路径PythonProjects\DataAnalysis\data.csv指向上面的目录树里的data.csv,等价的绝对路径是C:\Users\Alice\Documents\PythonProjects\DataAnalysis\data.csv。

若进程改用C:\Users\Alice\Downloads作为工作目录,同一相对路径会去找C:\Users\Alice\Downloads\PythonProjects\DataAnalysis\data.csv,那里没有这个文件,打开时报错。文件本身没动,变的是解析起点。

交互探索

切换当前工作目录,比较相对路径和绝对路径的解析结果。

工作目录改变后,路径指向哪里?

比较相对路径与绝对路径的解析。

正在准备演示…

题集

练习

  1. 在Unix风格路径中,下列哪个是绝对路径?

    选择答案
    参考解答

    Unix下以 / 开头的路径从根目录出发,与当前工作目录无关;其余三个都依赖当前工作目录。

  2. 目录的“执行”权限允许进程做什么?

    选择答案
    参考解答

    列出条目靠目录的读权限,增删条目靠写权限;执行权限允许穿过目录查找条目;访问目标文件还需要相应的文件权限。所以只有执行权限而没有读权限时,知道文件名仍可能打开文件,但无法列出目录。