该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先先看两个函数
函数名: findfirst, findnext
功 能: 搜索磁盘目录; 取得下一个匹配的findfirst模式的文件
用 法: int findfirst(char *pathname, struct ffblk *ffblk, int attrib);
int findnext(struct ffblk *ffblk);
程序例:
/* findnext example */
#include
#include
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是一个结构体,其内容为:
struct ffblk ...{
char ff_reserved[21];
char ff_attrib;
unsigned ff_ftime;
unsigned ff_fdate;
long ff_fsize;
char ff_name[13];
};
ff_attrib有以下几种形式,可以做为findfirst的参数:
#define WILDCARDS 0x01
#define EXTENSION 0x02
#define FILENAME 0x04
#define DIRECTORY 0x08
#define DRIVE 0x10
若要遍历目录,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")就好了,呵呵�