请问在NT, w2k, winXP 下的应用程序如何得知一个硬盘文件占用了哪些扇区?

alphasun 2003-07-08 01:44:42
rt
...全文
61 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jbz 2004-01-30
  • 打赏
  • 举报
回复
收藏
gzwy 2003-07-25
  • 打赏
  • 举报
回复
要想知道 文件占用了哪些扇区 一定要访问FAT表的呀。 jljljjl(菜鸟1/2) 老兄说的很清楚 了。
alphasun 2003-07-14
  • 打赏
  • 举报
回复
唉,看来是千难万险啊
linyudie 2003-07-13
  • 打赏
  • 举报
回复
去ms找规范来分析
谢继雷 2003-07-13
  • 打赏
  • 举报
回复
下面仅针对FAT-32文件系统,FAT-12,16类似;如果是NTFS劝你放弃。

设文件的路径是 \dir1\dir2\abc

第一步是找到根目录项:
在FAT-32分区引导记录中 偏移+42h 字节若 == 29h,那么 +2Ch 的DWORD指出根目录簇号,否则根目录簇号是2。

第二步是找到abc的目录项:
根目录结合FAT找到dir1的起始簇,再dir1结合FAT查找dir2的起始簇;直到找到abc的起始簇;
目录表中每一个目录项占用32字节,其中偏移+0Ah的WORD记录起始簇号的高半字,+10h记录起始簇号的低半字。

簇到扇区的计算方法:
(LBA)扇区索引 = FAT32分区起始扇区+保留扇区数+FAT扇区数*2+(簇号-2)*扇区每簇
保留扇区 位于 引导记录偏移 +0Eh 处的WORD,
扇区每簇 位于 引导记录偏移 +0Dh 处的BYTE。
其中FAT扇区数麻烦一点,如果 引导记录偏移 +42h 字节==29h, 则
FAT扇区数是 +24h 的 DWORD,
否则FAT扇区数是 +16h 的 WORD。

每个簇对应的 FAT 表项位置(相对于分区起始的字节偏移)
表项偏移=保留扇区数*512+簇号*4 (DWORD)
如果访问的是备份FAT表,则上面还要加上一个 FAT扇区数*512
对于FAT-16,上面是簇号*2 (WORD)
对于FAT-12,上面是簇号*1.5,乘积的整数部分 作为偏移:如果是偶簇,则偏移处字节作为12位数值的低8位、紧跟在后面的字节的低4位作为12位数值的高4位;如果是奇簇,则偏移处字节的高4位作为12为数值的低4位,紧跟在后面的字节作为12位数值的高8位。好在FAT-12现在很少用到了。:)

第三步就是用这些信息把文件的各个扇区找出来:
在FAT-32中文件是按簇组织的,因此只要把找出来的每一个簇,读取该簇所在的连续几个扇区就行了,也就是“扇区每簇”中记录的扇区数。一般常见的簇是4096或8192,也就是8个或16个扇区,因此一个簇号将对应8个或16个扇区。如果簇号是0FFFFFF8~0FFFFFFF之一则表示结束,这时就不必再继续找啦!
alphasun 2003-07-10
  • 打赏
  • 举报
回复
up11
alphasun 2003-07-09
  • 打赏
  • 举报
回复
额。。。。我有一个变通的方法了:)
xiaohedou 2003-07-09
  • 打赏
  • 举报
回复
我想应与NTFS的结构有关!请先查阅一下。
ajn_sailing 2003-07-09
  • 打赏
  • 举报
回复
up
alphasun 2003-07-09
  • 打赏
  • 举报
回复
up
alphasun 2003-07-08
  • 打赏
  • 举报
回复
up

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧