这一章继续用专业的符号语言说废话。。。
1、路径和路径元素(paths and path elements)
路径由路径元素组成,所有的路径包括到文件的路径、到目录的路径和到链接的路径。
路径的元素不能是空字符串也不能是{"", ".", "..", "/"}。
路径的元素不能包含{'/', ':'}。
当路径元素无效时,需要抛出InvalidPathException。
有效的路径元素:List[String]
如果路径中的某个路径元素是被禁用的字符,那么整个路径将会是无效路径。用符号语言表示为
forall e in pe: not (e in {'/', ':'}) not pe in {"", ".", "..", "/"}
有效的路径:List<PathElement>
只有路径包含的所有路径元素都是有效元素,路径才是有效的。用符号语言表示为
def valid-path(pe): forall pe in Path: valid-path-element(pe)空数列表示的路径,[]是根路径,用字符串"/"表示
方法parent(path:Path):Path返回父路径,该操作可用符号语言表示为
def parent(pe) : pe[0:-1]该操作的前提条件(preconditions)是
path != []
文件名:路径->路径元素
路径的最后一个路径元素叫做文件名
def filename(p) : p[-1]
前提条件是
p != []
childElements:(Path p,Path q):Path
方法childElements:(Path p,Path q):Path返回路径p中接在路径q后面的所有路径元素
def childElements(p, q): p[len(q):]前提条件是:
# The path 'q' must be at the head of the path 'p' q == p[:len(q)]
ancestors(Path):List[Path]
将会返回路径的所有祖先路径。
2、定义文件系统
一个文件系统包含一个目录的集合,一个路径的字典和一个链接的字典(字典就是python中的dictionary)
(Directories:set[Path], Files:[Path:List[byte]], Symlinks:set[Path])访问方法返回文件系统的特定元素
def FS.Directories = FS.Directories def file(FS) = FS.Files def symlinks(FS) = FS.Symlinks def filenames(FS) = keys(FS.Files)路径的集合限定了解析路径的方法和目录、链接
def paths(FS) = FS.Directories + filenames(FS) + FS.Symlinks)如果路径在这个集合中,那么它是存在的
def exists(FS, p) = p in paths(FS)根节点"/"必须存在
def isRoot(p) = p == ["/"]. forall FS in FileSystems : ["/"] in FS.Directories路径可以指向一个目录
isDir(FS, p): p in FS.Directories文件系统中存在以目录为前缀的路径。
forall p in paths(FS) : isRoot(p) or isDir(FS, parent(p))目录可以有子节点
def children(FS, p) = {q for q in paths(FS) where parent(q) == p}路径D或它的祖先在路径P之下,则P是D的父辈
def isDescendant(P, D) = parent(D) == P where isDescendant(P, parent(D))路径P的子元素,是所有以它为前缀的路径的集合
def descendants(FS, D) = {p for p in paths(FS) where isDescendant(D, p)}路径可以指向文件,路径是key
def isFile(FS, p) = p in FS.Files路径可以是一个链接
def isSymlink(FS, p) = p in symlinks(FS)路径的长度是它指向的数据的长度,如果是目录的话长度是0
3、user home
用户home目录是文件系统的一部分,它来自用户进程的userid
def getHomeDirectory(FS) : Path一个路径只能指向一个目标(目录、文件或链接)
FS.Directories ^ keys(data(FS)) == {} FS.Directories ^ symlinks(FS) == {} keys(data(FS))(FS) ^ symlinks(FS) == {}