文件枚举问题

在看EXAM13文件枚举的程序中遇到不明白的地方,求指导! for ( FileCount = 1; OldFileCount < FileCount; OldFileCount ++ ) { if ( FileNameBuffer[ OldFileCount ].Attr & ATTR_DIRECTORY ) { strcpy( mCmdParam.Open.mPathName, FileNameBuffer[ OldFileCount ].Name ); CH375vStartCluster = FileNameBuffer[ OldFileCount ].DirStartClust; /* 当前目录的上级目录的起始簇号,便于用相对路径打开,比完整路径名速度快 */ i = CH375FileOpen( ); if ( i == ERR_SUCCESS ) return( ERR_MISS_DIR ); /* 应该是打开了目录,但是返回结果是打开了文件 */ if ( i != ERR_OPEN_DIR ) return( i ); if ( OldFileCount ) CurrentDirStartClust = CH375vStartCluster; /* 不是根目录,获取目录的起始簇号 */ else { /* 是根目录,获取根目录的起始簇号 */ if ( CH375vDiskFat == DISK_FAT32 ) CurrentDirStartClust = CH375vDiskRoot; /* FAT32根目录 */ else CurrentDirStartClust = 0; /* FAT12/FAT16根目录 */ } CH375FileClose( ); /* 对于根目录一定要关闭 */

1、当OldFileCount为0时,其中的FileOpen()实现的是什么? 2、FileOpen()后面的注释说“打开目录,仅为了获取目录的起始簇号以提高速度 ”,这句话没明白什么意思,可不可以解释一下?

OldFileCount为0表示根目录,调用打开函数是为了获取根目录起始簇号,这样就在该簇所在扇区查找文件名,不需要全盘搜索,也就提高了速度。


1、根目录的起始簇号不是在CH375vDiskRoot这个变量里吗?直接赋值不就可以了吗?为什么一定要FileOpen()? 2、怎么实现在该簇所在扇区查找文件名,例程中哪里有体现到?


我一直觉得这句话很奇怪诶:for ( FileCount = 1; OldFileCount < FileCount; OldFileCount ++ ) ,下面的函数有没有对FileCount进行加处理,那这个循环不就执行一次就结束了吗?


(1)每个U盘根目录起始簇都不一样,你直接赋值肯定不行。 (2)获取到目录的起始簇号,调用ListFile:列举指定目录下的所有文件。 (3)我们的库里面,每搜索到一个文件FileOpen都会调用xFileNameEnumer回调程序,在这个函数中有对FileCount的处理。


在CH376中的EXAM13 CH376WriteVar32( VAR_START_CLUSTER, FileNameBuffer[ index ].DirStartClust ); /* 将当前目录的上级目录的起始簇号设置为当前簇号,相当于打开上级目录 */ printf( "List Directory: %s\n", FileNameBuffer[ index ].Name ); /* 显示当前要列举的目录名 */ s = CH376FileOpen( FileNameBuffer[ index ].Name ); /* 打开目录,仅为了获取目录的起始簇号以提高速度 */ if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* 应该是打开了目录,但是返回结果是打开了文件 */ else if ( s != ERR_OPEN_DIR ) return( s ); if ( index ) CurrentDirStartClust = CH376ReadVar32( VAR_START_CLUSTER ); /* 不是根目录,获取目录的起始簇号 */ else CurrentDirStartClust = 0; /* 是根目录 */ CH376FileClose( FALSE ); /* 对于根目录一定要关闭 */

根目录的起始簇号是0?


根目录起始的簇号应该是2,这个编号是从2开始的。你可以读一下CH376ReadVar32( VAR_START_CLUSTER )的值。


读了CH376ReadVar32( VAR_START_CLUSTER )的值为2。谢啦


只有登录才能回复,可以选择微信账号登录