文件夹的本质

前面说过,我们可以对文件进行读写等操作。那么给一个文件名,操作系统是怎么知道从什么地方读取文件的内容呢?或者说,文件在磁盘上的什么位置,操作系统是如何知道的呢?这当然需要一个数据结构来记录每个文件在磁盘上的地址,这个数据结构就是文件夹

文件夹也称为目录夹(folder),它保存的不是用户数据,而是关于文件及文件系统的信息。简单地说,文件夹的角色就是跟踪文件,里面存放的是从文件到文件在磁盘的地址的映射,即“文件名→文件在磁盘上的地址”。文件夹对于文件来说,就相当于动态地址翻译对于虚拟地址的作用,即从虚拟地址到实际地址的一种翻译机制。

这样,当给予一个文件名时,我们从文件夹里可以找到该文件所在的位置,从而发出正确的读取命令。那么文件在磁盘上的地址是什么呢?这就要看文件在磁盘上是如何存放了。如果文件在磁盘上是连续存放的,即一个文件占用一片连续的磁盘空间,则文件在磁盘上的地址就是该文件的第一块数据块所在的磁盘扇面号。当然,文件的存放不只有连续存放一种模式,因此文件在磁盘上的地址还有别的形式,我们稍后解释。但总的一点就是,文件夹应该提供一种找出一个文件所有磁盘块的方法。

既然文件夹存放的是文件名到磁盘地址的映射,那么自然地我们可以以一个简单数组来实现。这个数组是以文本文件存放的,你可以自己写一个程序打开这个文件就可以看到里面的内容。而读取文件夹的内容就变成读取这个简单数组的内容。而这正是shell utility"ls"(UNIX、Linux、Windows Power Shell)和"dir"(Windows)所做的事情。

文件夹结构

由于文件夹里面又可以有文件夹,这样就形成了一个层次结构。这个层次结构的顶端就是根文件夹,也称为根目录,如图16-7所示。
在这里插入图片描述
根目录是一个文件系统的总起点,它在操作系统启动的时候加载到内存。从根目录开始,该文件系统里面的所有文件都可以找出来。由于根目录是整个文件系统的源点,如果根目录损坏,则整个文件系统都无法访问,也就说文件系统已经崩溃

下面我们看一下如何从一个文件名找到其所在的磁盘地址。假定我们要找的文件是:

/zou/cs307/file.pdf

这个文件名最前面的“/”代表的就是根目录。因此,我们首先从根目录开始寻找。根目录里面可能保护许多文件和文件夹,其中的一个文件夹就是zou,而根目录里面存放有zou文件夹所在的磁盘地址。我们获得的磁盘地址读取zou的内容(一个文本数组),将其打开。

我们发现,打开的zou文件夹里又包括另一个文件夹cs307及其在磁盘上的位置。我们从给出的磁盘位置上读取文件夹cs307的内容(另一个文本数组),发现里面包括一个文件名为file.pdf的文件及其对应的磁盘地址。我们从给出的磁盘地址上就可以读取文件file.pdf的内容。这样从根目录开始,我们需要访问磁盘3次才能得到文件file.pdf的内容。

相对路径与绝对路径

上节的例子给出的文件名"zou/cs307/file.pdf"包括从根目录开始的一个完全路径,因此称为绝对路径。绝对路径是从根目录的视角看一个文件的访问路径。与此相对的是相对路径,即从某个工作目录,如用户当前所处的目录的角度看某一个文件的访问路径。

例如,如果我们目前已经在目录"zou/cs307/"下,则只需要给出文件名file.pdf即可访问该文件。

使用相对路径的好处是没有必要寻遍整个目录夹,可以节省磁盘访问次数,从而提高文件访问效率。前面讲过,从根目录开始需要3次磁盘访问才能得到文件file.pdf的内容;但如果在工作目录"zou/cs307/"下直接给出文件名file.pdf,则只需要进行一次磁盘访问即可。因为当前目录的内容是已经打开的,即已经加载到内存的,我们无须磁盘访问即可查看当前目录内容,发现file.pdf的文件及其对应的磁盘地址。我们只需要按照该地址对磁盘进行一个访问即可获得file.pdf的内容。

但需要注意的是,相对路径不一定总是比绝对路径节省磁盘访问次数。如果你要访问的文件是当前这个目录的“直系后代”,则将节省磁盘访问次数;否则,即如果不是“直系后代”,你就可能多花费时间。例如,在图16-7的目录树里面,如果当前目录是“目录夹1”,则使用相对路径访问“文件1”将节省磁盘访问次数,而访问“文件2”则比绝对路径更费时间。这一点我们从相对“文件2”的相对路径和绝对路径名就可以看出:

文件2的相对路径名:“../目录2/文件2”。
文件2的绝对路径名:“/目录2/文件2”。

共享与链接

就像到达一个目的地通常有多条路可走一样,访问一个文件也可以选择多条路径。实现多条路径依靠的是链接。我们前面说过,从目录夹1下面访问文件2,无论使用绝对路径还是相对路径,均需要经过根目录。而从目录夹2下面访问文件2则无须经过根目录。自然,从目录夹2访问文件2比起从目录夹1访问文件2来说效率要高。

那有没有办法使得从目录夹1下访问文件2的效率与从目录夹2下访问文件2的效率一样呢?有,这个办法就是从目录夹1建立一条到文件2的链接。链接的建立使用操作系统的Link系统调用,该调用给出一个目录名和一个文件名,在操作后,从该目录到该文件将存在一个“直系下属”关系,我们从该目录可以直接访问该文件。也就说,打开该目录我们可以看到该文件。

链接使得文件的共享相当方便。尽管我们可以通过文件拷贝来实现共享,但那种共享不是即时共享,即一个人修改文件内容后,需要再次拷贝才能被另外一个人看见。而使用链接就无须这种循环往复的拷贝。修改的内容另一个人可以直接看到

总结

  • 文件夹存储关于文件和文件系统的信息,本质存储一个文本数组
  • 根目录是整个文件系统的源点,如果根目录损坏,则整个文件系统都无法访问,也就说文件系统已经崩溃
  • 使用相对路径的好处是没有必要寻遍整个目录夹,可以节省磁盘访问次数,从而提高文件访问效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值