1. 一级目录系统
目录系统最简单的形式是有一个能够包含所有文件的目录。这种目录被称为根目录(root directory),由于根目录的唯一性,所以其名称并不重要。在最早期的个人计算机中,这种系统很常见,部分原因是因为只有一个用户。下面是一个单层目录系统的例子
该目录中有四个文件。这种设计的优点在于简单,并且能够快速定位文件,毕竟只有一个地方可以检索。这种目录组织形式现在一般用于简单的嵌入式设备(如数码相机和某些便携式音乐播放器)上使用
2. 层次目录系统
对于简单的应用而言,一般都用单层目录方式,但是这种组织形式并不适合于现代计算机,因为现代计算机含有成千上万个文件和文件夹。如果都放在根目录下,查找起来会非常困难。为了解决这一问题,出现了层次目录系统(Hierarchical Directory Systems),也称为目录树。通过这种方式,可以用很多目录把文件进行分组。进而,如果多个用户共享同一个文件服务器,比如公司的网络系统,每个用户可以为自己的目录树拥有自己的私人根目录。这种方式的组织结构如下
根目录含有目录 A、B 和 C ,分别属于不同的用户,其中两个用户个字创建了子目录。用户可以创建任意数量的子目录,现代文件系统都是按照这种方式组织的
3. 路径名
当目录树组织文件系统时,需要有某种方法指明文件名。常用的方法有两种,第一种方式是每个文件都会用一个绝对路径名(absolute path name),它由根目录到文件的路径组成。举个例子,
/usr/ast/mailbox
意味着根目录包含一个子目录usr,usr 下面包含了一个 mailbox。绝对路径名总是以/
开头,并且是唯一的。在UNIX中,路径的组件由/
分隔。在Windows中,分隔符为\
。 在 MULTICS 中,它是>
。 因此,在这三个系统中,相同的路径名将被编写如下1
2
3Windows \usr\ast\mailbox
UNIX /usr/ast/mailbox
MULTICS >usr>ast>mailbox另外一种指定文件名的方法是 相对路径名(relative path name)。它常常和 工作目录(working directory) (也称作 当前目录(current directory))一起使用。用户可以指定一个目录作为当前工作目录。例如,如果当前目录是
/usr/ast
,那么绝对路径/usr/ast/mailbox
可以直接使用mailbox
来引用。也就是说,如果工作目录是/usr/ast
,则 UNIX 命令cp /usr/ast/mailbox /usr/ast/mailbox.bak
和命令cp mailbox mailbox.bak
具有相同的含义。相对路径通常情况下更加方便和简洁。而它实现的功能和绝对路径安全相同一些程序需要访问某个特定的文件而不必关心当前的工作目录是什么。在这种情况下,应该使用绝对路径名。支持层次目录结构的大多数操作系统在每个目录中有两个特殊的目录项
.
和..
,长读作 dot 和 dotdot。dot 指的是当前目录,dotdot 指的是其父目录(在根目录中例外,在根目录中指向自己)。可以参考下面的进程树来查看如何使用一个进程的工作目录是
/usr/ast
,它可采用..
沿树向上,例如,可用命令cp ../lib/dictionary .
把文件usr/lib/dictionary
复制到自己的目录下,第一个路径告诉系统向上找(到 usr 目录),然后向下到 lib 目录,找到 dictionary 文件。第二个参数.
指定当前的工作目录,当 cp 命令用目录名作为最后一个参数时,则把全部的文件复制到该目录中。当然,对于上述复制,键入cp /usr/lib/dictionary .
是更常用的方法。用户这里采用.
可以避免键入两次 dictionary 。无论如何,键入cp /usr/lib/dictionary dictionary
也可正常工作,就像键入cp /usr/lib/dictionary /usr/lib/dictionary
一样。所有这些命令都能够完成同样的工作
4. 目录操作
- 不同文件中管理目录的系统调用的差别比管理文件的系统调用差别大。为了了解这些系统调用有哪些以及它们怎样工作,下面给出一个例子(取自 UNIX)
- Create,创建目录,除了目录项
.
和..
外,目录内容为空 - Delete,删除目录,只有空目录可以删除。只包含
.
和..
的目录被认为是空目录,这两个目录项通常不能删除 - opendir,目录内容可被读取。例如,未列出目录中的全部文件,程序必须先打开该目录,然后读其中全部文件的文件名。与打开和读文件相同,在读目录前,必须先打开文件
- closedir,读目录结束后,应该关闭目录用于释放内部表空间
- readdir,系统调用 readdir 返回打开目录的下一个目录项。以前也采用 read 系统调用来读取目录,但是这种方法有一个缺点:程序员必须了解和处理目录的内部结构。相反,不论采用哪一种目录结构,readdir 总是以标准格式返回一个目录项
- rename,在很多方面目录和文件都相似。文件可以更换名称,目录也可以
- link,链接技术允许在多个目录中出现同一个文件。这个系统调用指定一个存在的文件和一个路径名,并建立从该文件到路径所指名字的链接。这样,可以在多个目录中出现同一个文件。有时也被称为硬链接(hard link)
- unlink,删除目录项。如果被解除链接的文件只出现在一个目录中,则将它从文件中删除。如果它出现在多个目录中,则只删除指定路径名的链接,依然保留其他路径名的链接。在 UNIX 中,用于删除文件的系统调用就是 unlink