hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1534回复:6

遍历根目录中的文件?(50分)

楼主#
更多 发布于:2004-03-31 20:43
各位帮我看看我得理解对不对?
  是不是说目录项中的文件名的第一个字符如果为E5或者00就说明是最后一个目录项?如果是这样的话对于非根目录的目录区只要看是否有E5或00开头的目录项即可!
  可是对于根目录好像比较特殊吧?我用Winhex查看了我的U盘的根目录区,U盘是FAT16,每簇4个扇区.根目录区占用32个扇区,也就是占用4个簇.是不是说每簇中的目录项的文件名的第一个字符为E5或者是00就说明该簇已经没有有用的文件了?然后再在另外的三个簇中寻找最后一个目录项?可是我却发现在最后一个目录项所在的簇后面还是有非E5和00的目录项存在.
不知道对于根目录区该如何遍历文件?
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-01 10:18
诚如楼上两位所说的,我看了FAT的白皮书,确实是00结束!都怪小弟没有事先看白皮书,呵呵,打扰大家了!给分了!
shaoshengli
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2022-02-14
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望77点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-04-01 08:28
U盘分五个区:
MBR
   Hidden Sector
DBR
FAT1
FAT2  
FDT   (根目目录)
DATA
遍历根目录是一件很简单的事,因位它是一个固定大小,固定位置存放目录项列表的数据区。给一段我写的根目录遍历的代码给你看看就明白了。(E5代表文件已经被删除的意思)具体的查一下,优盘文件系统(FOR C)好象精华区有下载。

根目录的文件项的大小在DBR->BPB_wRootEntry中设置。
FDT_ADDR = 0x8000
DATA_ADDR = 0xc000
DBR->BPB_wRootEntry = 512

Example:currentFileLocate = FDT_ADDR
        FAT_FileFindNext("*.mp3)

unsigned int FAT_FileFindNext(unsigned int *pch)
{
unsigned int i, ch[11],ic[2];
for(i=0; i<11; i++)
{
if(*pch == '.')
{
pch++;
i=8;
}
ch=*pch++;
}

while(currentFileLocate < DATA_ADDR)
{
NF_ReadMultiByte(currentFileLocate, 32, (unsigned int)&fileDirEntry );
currentFileLocate+=0x20;
if( fileDirEntry.ExtName[0] == ch[8] &&
fileDirEntry.ExtName[1] == ch[9] &&
fileDirEntry.ExtName[2] == ch[10] )
{//Finded File
fileHandler.StartClus = fileDirEntry.StartClus[1]*0x100 + fileDirEntry.StartClus[0];
fileHandler.CurrentClus = fileHandler.StartClus;

#if FAT16
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus-1)*2), 2, ic);
fileHandler.NextClus=(ic[1]&0xff)*0x100 + (ic[0]&0xff);
#else
NF_ReadMultiByte(FAT1_ADDR + ((fileHandler.CurrentClus * 1.5)), 2, ic);
if(fileHandler.CurrentClus & 0x01)
{//Odd Number //Get IC[0].Hight 4 Bit
fileHandler.NextClus=  ( (ic[0]>>4)&0x0f ) | ((ic[1]<<4)&0x0ff0);
}
else
{//Even Number
fileHandler.NextClus= ic[0] | ((ic[1]<<8) & 0x0f00);
}
#endif

fileHandler.FileLen = fileDirEntry.FileLength[0]
+ fileDirEntry.FileLength[1]*0x100
+ fileDirEntry.FileLength[2]*0x10000
+ fileDirEntry.FileLength[3]*0x1000000;

fileHandler.FileCount=0x0000;
return(TRUE);
}
}
return(FALSE); //Not Find File
}

boycn
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2010-08-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-31 23:30
其实简单一点说就是我想知道在遍历目录里的文件的时候,什么时候结束!

是00结束,E5不行
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-31 21:35
其实简单一点说就是我想知道在遍历目录里的文件的时候,什么时候结束!
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-31 21:32
hehe不好意思,讲的有点罗索!我的mail:zgq@cdut.edu.cn谢谢!
SUNSHANGXIN
驱动老牛
驱动老牛
  • 注册日期2002-11-19
  • 最后登录2009-08-01
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望19点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-31 20:50
晕 发个MAIL我给你
sunshangxin@163.com
[b]苍白的,不是文字,是人的思想 虚伪的,不是网络,是人的灵魂 伤心的,不是爱情,是人的心灵 难忘的,不是容貌,是人的思诀 黎明的曙光早已不见了夕日的辉煌 东方的日出早就失去了往日的灿烂 而我也尽脱了昨日的笑容去迎接明天的枯涩 [/b]
游客

返回顶部