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

 

开发环境: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")就好了,呵呵.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
循环队列的遍需要分情况讨论。如果队头指针小于等于队尾指针,则队列中的元素是连续的,可以直接使用循环结构遍;如果队头指针大于队尾指针,则需要分开遍队列中的元素,分别遍队头指针后面的元素以及队尾指针前面的元素。 下面是用C语言对循环队列进行遍的示例代码: ```c #include <stdio.h> #define MAXSIZE 10 typedef struct { int data[MAXSIZE]; int front, rear; } Queue; void initQueue(Queue *Q) { Q->front = Q->rear = 0; } int isEmpty(Queue Q) { return Q.front == Q.rear; } int isFull(Queue Q) { return (Q.rear+1) % MAXSIZE == Q.front; } void enQueue(Queue *Q, int x) { if (isFull(*Q)) { printf("Queue is full!\n"); return; } Q->data[Q->rear] = x; Q->rear = (Q->rear+1) % MAXSIZE; } void traverseQueue(Queue Q) { if (isEmpty(Q)) { printf("Queue is empty!\n"); return; } if (Q.front <= Q.rear) { for (int i=Q.front; i<Q.rear; i++) printf("%d ", Q.data[i]); } else { for (int i=Q.front; i<MAXSIZE; i++) printf("%d ", Q.data[i]); for (int i=0; i<Q.rear; i++) printf("%d ", Q.data[i]); } printf("\n"); } int main() { Queue Q; initQueue(&Q); enQueue(&Q, 1); enQueue(&Q, 2); enQueue(&Q, 3); enQueue(&Q, 4); enQueue(&Q, 5); traverseQueue(Q); return 0; } ``` 在这个示例代码中,我们定义了一个循环队列结构体,包含了队列的最大长度、队列的数据数组以及队头指针和队尾指针。我们还定义了一系列队列操作函数,包括初始化、判断队列是否为空或已满、入队和遍等。在遍函数中,我们根据队头和队尾指针的大小关系来决定使用哪种方式遍队列中的元素。最后,在主函数中我们初始化了一个队列并往里加入了一些元素,然后调用遍函数输出队列中的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值