更新时间:2022-08-25 12:15
当一个文件系统含有许多级时,每访问一个文件,都要使用从树根开始直到树叶(数据文件)为止的、包括各中间节点(目录)名的全路径名。这是相当麻烦的事,同时由于一个进程运行时所访问的文件大多仅局限于某个范围,因而非常不便。基于这一点,可为每个进程设置一个“当前目录” ,又称为“工作目录” 。进程对各文件的访问都相对于“当前目录”而进行。此时各文件所使用的路径名,只需从当前目录开始,逐级经过中间的目录文件,最后到达要访问的数据文件。当前目录即当前用户或经常正在使用的目录。
在计算机或相关设备中,一个“目录”或“文件夹”就是一个装有数字文件系统的虚拟“容器”。在它里面保存着一组文件和其它一些目录(文件夹)。计算机的文件系统可被形象地看作一个文件“橱柜”。在它之中,高等的目录(文件夹)中有“抽屉”,低等的子目录中可能有“抽屉”中的文件夹。一个典型的文件系统可能会包含成千上万个目录(文件夹)。多个文件通过存储在一个目录(文件夹)中,可以达到有组织的存储文件的目的。在一个目录(文件夹)中的另一个目录(文件夹)被称作它的子目录(子文件夹)。这样,这些目录(文件夹)就构成了层次(hierarchy),或树形结构。
有些操作系统中,用户被限制只能访问他们自己的用户文件夹或工程目录,使用户间的活动相隔离。在 Unix 中,目录被看作一类文件。当前目录即当前用户正在使用的目录。使用当前目录的主要目的是为了提高文件的检索速度。
目录结构的组织,关系到文件系统的存取速度,也关系到文件的共享性和安全性。因此,组织好文件的目录,是设计好文件系统的重要环节。目前常用的目录结构形式有单级目录、两级目录和多级目录。
这是最简单的目录结构。在整个文件系统中只建立一张目录表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址以及其它文件属性。此外,为表明每个目录项是否空闲,又设置了一个状态位。
为了克服单级目录所存在的缺点,可以为每一个用户建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录具有相似的结构,它由用户所有文件的文件控制块组成。 此外, 在系统中再建立一个主文件目录 MFD(Master File Directory); 在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录文件的指针。
对于大型文件系统,通常采用三级或三级以上的目录结构,以提高对目录的检索速度和文件系统的性能。多级目录结构又称为树型目录结构,主目录在这里被称为根目录,把数据文件称为树叶,其它的目录均作为树的结点。
在树形目录结构中,从根目录到任何数据文件,都只有一条惟一的通路。在该路径上从树的根(即主目录)开始,把全部目录文件名与数据文件名依次地用“/”连接起来,即构成该数据文件的路径名(path name)。系统中的每一个文件都有惟一的路径名。把从当前目录开始直到数据文件为止所构成的路径名,称为相对路径名(relative path name);而把从树根开始的路径名称为绝对路径名(absolute path name)。
当用户要访问一个已存在文件时,系统首先利用用户提供的文件名对目录进行查询,找出该文件的文件控制块或对应索引结点;然后,根据 FCB 或索引结点中所记录的文件物理地址(盘块号),换算出文件在磁盘上的物理位置;最后,再通过磁盘驱动程序,将所需文件读入内存。目前对目录进行查询的方式有两种: 线性检索法和 Hash 方法。
线性检索法又称为顺序检索法。在单级目录中,利用用户提供的文件名,用顺序查找法直接从文件目录中找到指名文件的目录项。在树型目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时须对多级目录进行查找。假定用户给定的文件路径名是/usr/ast/mbox,则查找/usr/ast/mbox 文件的过程如图1所示。
具体查找过程说明如下:
首先,系统应先读入第一个文件分量名 usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名顺序地进行比较,从中找出匹配者,并得到匹配项的索引结点号 6,再从6 号索引结点中得知 usr 目录文件放在 132 号盘块中,将该盘块内容读入内存。
接着,系统再将路径名中的第二个文件分量名 ast 读入,用它与放在 132 号盘块中的第二级目录文件中各目录项的文件名顺序进行比较,又找到匹配项,从中得到 ast 的目录文件放在26 号索引结点中, 再从26号索引结点中得知/usr/ast是存放在496号盘块中, 再读入496号盘块。
然后, 系统又将该文件的第三个分量名 mbox 读入, 用它与第三级目录文件/usr/ast 中各目录项中的文件名进行比较,最后得到/usr/ast/mbox 的索引结点号为 60,即在 60 号索引结点中存放了指定文件的物理地址。目录查询操作到此结束。如果在顺序查找过程中发现有一个文件分量名未能找到,则应停止查找,并返回“文件未找到”信息。
如果我们建立了一张 Hash 索引文件目录,便可利用Hash 方法进行查询,即系统利用用户提供的文件名并将它变换为文件目录的索引值,再利用该索引值到目录中去查找,这将显著地提高检索速度。
顺便指出,在现代操作系统中,通常都提供了模式匹配功能,即在文件名中使用了通配符“*” 、 “?”等。对于使用了通配符的文件名,系统此时便无法利用 Hash 方法检索目录,因此,这时系统还是需要利用线性查找法查找目录。
在进行文件名的转换时,有可能把 n 个不同的文件名转换为相同的 Hash 值,即出现了所谓的“冲突” 。一种处理此“冲突”的有效规则是:
(1) 在利用 Hash 法索引查找目录时,如果目录表中相应的目录项是空的,则表示系统中并无指定文件。
(2) 如果目录项中的文件名与指定文件名相匹配, 则表示该目录项正是所要寻找的文件所对应的目录项,故而可从中找到该文件所在的物理地址。
(3) 如果在目录表的相应目录项中的文件名与指定文件名并不匹配,则表示发生了“冲突” , 此时须将其 Hash 值再加上一个常数(该常数应与目录的长度值互质), 形成新的索引值,再返回到第一步重新开始查找。
命令 1:mkdir
用途:创建目录
实例 1:mkdir do
含义:在当前目录下创建名为 do 的子目录
实例 2:mkdir do/align
含义:在子目录 do 下创建名为 align 的子目录(子目录 do 已经存在)
实例 3:mkdir –p hba/tree
含义:在当前目录下创建名为 hba 的子目录,并在子目录 hba 下创建名为 tree 的子目录
命令 2:rmdir
用途:删除目录
实例 1:rmdir tmp
含义:删除当前目录下名为 tmp 的子目录,该子目录中没有文件和子目录
命令 3:cd
用途:改变目录
实例 1:cd
含义:回到用户主目录,即登录时进入的目录
实例 2:cd do
含义:进入子目录 do
实例 3:cd ..
含义:回到上级目录
实例 4:cd hba/tree
含义:直接进入子目录 hba 下的 tree 子目录
实例 5:cd ../do/align
含义:进入上级目录 do 下的 align 子目录
命令 4:ls
用途:显示文件或目录
实例 1:ls
含义:显示当前目录下子目录和文件名
实例 2:ls -l
含义:显示当前目录下子目录和文件名详细信息,包括属性、权限、大小和创建日期等
命令 5:rm
用途:删除文件或目录
实例 1:rm seq2
含义:删除文件 seq2
实例 2:rm *.txt
含义:删除所有以.txt 结尾的文件
实例 3:rm –r temp/*
含义:删除子目录 temp 下所有子目录和文件,保留该目录
实例 4:rm –r temp
含义:删除子目录 temp 和该目录下所有子目录和文件
命令 6:chmod
用途:改变文件或目录权限
实例 1:chmod –w ppf1.fas
含义:取消所有用户对 ppf1.fas 的写权限
实例 2:chmod +w seq1
含义:将当前目录下 seq1 设置为本用户可写,其他用户权限不变
实例 3:chmod -w keep/
含义:取消子目录 keep 写权限,不能在该目录下创建和删除文件或子目录
实例 4:chmod 755 bin/*
含义:将子目录 bin 下所有文件设置为本用户可读可写可执行,其它用户可读可执行