现在的位置: 首页 > 综合 > 正文

DOS用C语言下对文件目录的遍历

2013年08月03日 ⁄ 综合 ⁄ 共 1787字 ⁄ 字号 评论关闭

 

开发环境:Turbo C 2.0

首先先看两个函数

 

函数名: findfirst, findnext
功  能: 搜索磁盘目录; 取得下一个匹配的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是一个结构体,其内容为:

 

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")就好了,呵呵.

抱歉!评论已关闭.