cmobile
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2503回复:9

文件系统(FAT12/FAT16)中:子目录下的文件的存储

楼主#
更多 发布于:2005-05-26 14:14
请教各位一个问题:
假设某一路径 C:\\DOC\\EXAM\\ 下有文件 file1.txt; file2.txt; file3.txt
文件系统类型为 FAT12/FAT16
那么,请问:
1.EXAM这个子目录的簇链中,“file1.txt; file2.txt; file3.txt ”的3个目录项(每个32Byte)有个专门的区域存放吗?
2.如果不是,那在这个簇链中是如何存放\"file1.txt; file2.txt; file3.txt \"3个文件的目录项和其对应的文件内容的?
在此先谢了!
-
henry_wu001
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2010-03-04
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望103点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-08-26 15:43
谢谢,精彩的问答,
虽然不是现场直播,依然受益匪浅
cmobile
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-27 18:51
我已经完全明白了!
多谢templa对我提出的疑问的热心回答!

为了表示对templa的感谢,我决定给21回答得分。可不知道为什么,当我点“给分”的时候,系统显示“你不是发贴人或已经给分”。不成功。
每次我输入UID,PWD登陆后,进入“开发论坛”,可进入帖子的时候,网页的左上角显示“你还没登陆”,但我有能以登陆的用户名发表帖子,请为有谁知道为什么吗?
-
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-27 13:15
看来不是cmobile的粗心又继续了,就是我描述得让人迷惑了!
目录名EXAM实际可认为和文件一样,可以不是只由1个簇组成的,当然可以在原先的簇链后增加.就像一个原本占1簇的文件因编辑器的修改变为占多个簇:第一个簇是在文件项中得到,而第2和之后的簇号都是由单向链表(FAT)确定的.这只取决于系统根据当时情况计算得到的下1个空闲簇号用来分配,可能会像cmobile形容的那样(相差10M甚至更远).
如果继续cmobile的假设,答案是第1种情况.
因为在FAT的首扇中对第2簇(EXAM文件名所在簇)描述的变化是像:
原先(文件项只占1簇时)是FF因为只有1簇是文件项,本簇即尾簇;
而现在(文件项占多簇时)就成为下个文件项所在簇的簇号(cmobile所说的n)...,据此链表可得到所有文件项而不致浪费效率.
cmobile
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-27 11:55
不好意思,粗心了,没注意那个假设。
对于文件名的存储,我基本已经弄清楚了
这里关于文件名的搜索,我有个疑问想问一下:
接着templa上面的假设

我要找EXAM下的FILE1.txt,那只要搜索到簇3就可以知道FILE1.TXT的簇链了
那假设有一文件FILEn.TXT,它的文件名是放在“增加簇”簇n中的,而且簇3和簇n相差很远(如有10M空间),那现在我要搜索FILEn.TXT,那是如何搜索的呢?
1.先搜索簇3这个文件目录区,没搜到;再跳到簇n搜索
  还是
2.直接依次沿着簇链从簇3搜索到簇n

如果是情况1,那系统怎么知道搜索完簇3后,直接跳到簇n 呢
如果是情况2,那不是要搜索很多的扇区(大部分是多余的扇区),这样岂不是很慢效率很低?
-
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-27 10:35
我在假设里已经说明:FILE1\\FILE2\\FILE3都只占1个簇,如果文件大于1个簇,当然会使得其后的文件的首簇后移!举例只是为说明问题!
另外的问题:
1.\"注意除根目录项之外派生的文件目录项是作为文件存在的,还要加上.和..。\"   第1和第2个32字节分别用来放父目录和子目录即\"..\"\".\";
2.如果文件项不够,可以象文件变大一样,增加簇链就行了.子目录项完全可以超过32扇区,这只取决于文件数量,这一点不同于根目录项.
cmobile
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-27 09:55
接着上面templa所说的
\"簇3的第4个32字节放FILE2.TXT,它的DIR_FstClusL0指向文件数据首簇(应该是簇5)\"
我觉得这里首簇不一定是簇5,因为如果FILE1.TXT的文件内容大于1个簇的话,簇5早已被FILE1.TXT的数据内容使用.所以这里有可能是簇5以后的某个簇.

针对templa所说的,再提几个问题:
1.在簇2里,为什么要第3个32字节才描述了EXAM,而不从第1个32字节就描述EXAM呢?
2.在簇3里,有(BytesPerClus/32)个文件项,这么说EXAM下的目录或文件的数量就是有限的了吧. 那如果簇3已经被文件项占用完,此时我要在些文件的话(同样是EXAM下),还能写进去吗?不能的话,文件系统怎么处理(是不是再扩展一个簇给来放文件项)?
-
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-27 09:17
cmobile的理解大致是对的。
举个例子:
    假设:
cmobile的C盘的结构就如头贴描述,别无其他文件或目录存在;
3个FILE.TXT都只占一个簇。

那么DOC存在于根目录扇区占32字节,其DIR_FstClusL0指向EXAM所在的簇号(应该是簇2),在簇2的第3个32字节描述了EXAM,其DIR_FstClusL0指向它的下级目录项所在的簇号(应该是簇3),那么在簇3里,有(BytesPerClus/32)个文件项,第3个32字节放FILE1.TXT,它的DIR_FstClusL0指向文件数据首簇(应该是簇4),簇3的第4个32字节放FILE2.TXT,它的DIR_FstClusL0指向文件数据首簇(应该是簇5),以此类推...
cmobile
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-26 21:05
多谢templa的回答!
那么我接着问一下:
templa所说的“EXAM所在的簇各个文件项的DIR_FstClusL0...”中
“各个文件项”(也就是“各个目录项”吧)是怎么存放的呢?是不是:
3个文件目录项存放在一个簇(或区域)中,每个文件目录项占32Byte?
接着3个文件项又分别指向各自的文件内容?
-
templa
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2013-03-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-26 15:08
试着回答一下,描述得有错误请大家批评指正:
在FAT16中
首先DOC存在于根目录区(一般是32个扇区),而其DIR_FstClusL0指向的是EXAM所在的簇链(可认为是占1簇的1个文件),进而EXAMEXAM所在的簇各个文件项的DIR_FstClusL0指向的是3个文件(file1.txt、 file2.txt、 file3.txt )所在的簇链。
注意除根目录项之外派生的文件目录项是作为文件存在的,还要加上.和..。
游客

返回顶部