开发环境:Turbo C 2.0
首先先看两个函数
功 能: 搜索磁盘目录; 取得下一个匹配的findfirst模式的文件
用 法: int findfirst( char * pathname, struct ffblk * ffblk, int attrib);
int findnext( struct ffblk * ffblk);
程序例:
/* findnext example */
#include < stdio.h >
#include < dir.h >
int main( void )
{
struct ffblk ffblk;
int done;
printf( " Directory listing of *.* " );
done = findfirst( " *.* " , & ffblk, 0 );
while ( ! done)
{
printf( " %s " , ffblk.ff_name);
done = findnext( & ffblk);
}
return 0 ;
}
其中ffblk是一个结构体,其内容为:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
ff_attrib有以下几种形式,可以做为findfirst的参数:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
若要遍历目录,findfirst的第三个参数应该为 0x10,则在ffblk中的ff_attrib会返回相应的属性.
void GetDirMd5(char* filePath)
{
struct ffblk fileInfo;
int done;
char filePathCpy[MAX_PATH];
char fullPath[MAX_PATH];
int tag = 0;
strcpy(filePathCpy, filePath);
done = findfirst(filePathCpy, &fileInfo, 0x10);
if(done)
{
printf("Directory not exit!/n");
return;
}
while(tag != -1 )
{
if(fileInfo.ff_attrib == 0x10) /* is a directory */
{
if( !strcmp(fileInfo.ff_name, "." ) || !strcmp(fileInfo.ff_name, ".."))
{
tag = findnext(&fileInfo );
continue;
}
strcpy(fullPath, filePathCpy);
fullPath[strlen( fullPath ) - strlen("*.*")] = '/0';
strcat(fullPath, fileInfo.ff_name);
strcat(fullPath, "//*.*");
GetDirMd5(fullPath);
}
else /* is a file */
{
strcpy(fullPath, filePath);
fullPath[strlen(fullPath) - strlen("*.*")] = '/0';
strcat(fullPath, fileInfo.ff_name);
printf("%s", fullPath);
iFileNum += 1;
}
tag = findnext(&fileInfo);
}
}
注:粘代码时代码是有'/0'竟然粘不了!!
比如你遍历一下C盘下的Test目录,只需要GetDirMd5("C://Test//*.8")就好了,呵呵.