⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dir.c

📁 一个小程序
💻 C
字号:

#include   <stdlib.h>
#include   <stdio.h>
#include   <string.h>
#include   <dirent.h>
#include   <unistd.h>
#include   <sys/stat.h> 
#include   <sys/types.h>
#include   "Stack.h"

void  dir_scan(char   *path);   
int   count   =   0;   
Stack stack;                     // 声明一个栈

//入栈操作
int push (char dirname[MAXLEN])  
{
	int i,len;
	len = strlen(dirname);
	if (len > MAXLEN)
	   return err;
	   
	stack.top ++;   
	for( i = 0; i < len; i++)
	   stack.data[stack.top][i] = dirname[i];
		
	return ok;
}

//返回栈顶元素                    
char * gettop ()
{
  return stack.data[stack.top];
} 

//出栈操作
int pop ()                       
{
	memset(stack.data[stack.top], 0 ,MAXLEN);
	stack.top--;
	return ok;
}

//是否空
int isempty ()
{
	if (stack.top < 0)
	   return ok;
	else
	   return err;
}     

//是否满              
int isfull ()
{
	 if (stack.top == MAXSIZE)
	     return ok;
	 else
	     return err;
}

//初始化栈                   
int inistack ()
{
	stack.top = -1;
	memset(stack.data, 0 ,sizeof(stack.data));
	return ok;
}
                      
int   main(int   argc,   char   *argv[])   
{   
      struct   stat   s;   
      int      ret = 0 ;    //操作返回值
      char     inidir[MAXLEN];
      
      ret  =  inistack();      
      
      if(argc   !=   2)
      {  
           printf("one   direction   requried\n");   
           return 0;   
      }
      strcpy(inidir , argv[1]);
      for (ret =0; ret<strlen(inidir); ret ++)
      {
      	putchar(inidir[ret]);
      }
      putchar('\n');
      
      if(lstat(inidir,   &s)   <   0)
      {   
          printf("lstat   error\n");   
          return 99;           
      }   
      if(!S_ISDIR(s.st_mode))
      {   
         printf("%s   is   not   a   direction   name\n",   argv[1]);
         return 98;
      }  

      dir_scan(inidir);   
      printf("total:   %d   files\n",   count);   
      return 1;   
}   
    
void  dir_scan(char path[MAXLEN])   
{   
      struct   stat   s;   
      DIR           *dir;   
      struct   dirent   *dt;   
      char     dirname[MAXLEN],tempdir[MAXLEN]; 
      char     *strdir;
      int      j;
      
      memset(dirname,   0,   MAXLEN*sizeof(char));   
      strcpy(dirname,   path);
      if (strcmp(dirname,"/") != 0)   
          strcat(dirname , "/");
     
      push(dirname);

      while( !isempty() )
      {
      	strdir = gettop();

        strcpy(dirname,strdir);
        strcpy(tempdir,strdir);     //保存当前目录
        
        pop();      	              //退栈

      	if((dir   =   opendir(dirname))   ==   NULL)
        {   
          printf("opendir   %s/%s   error\n");   
          return ;   
        } 

        if(chdir(dirname)   <   0)   
        {   
          printf("chdir   error\n");   
          return ;   
        }
 
      	while((dt   =   readdir(dir))   !=   NULL)      	//
        {        	
        	if(dt->d_name[0]   ==   '.')
          {  
            continue;              
          }  
          //组成新的目录(文件)名
          memset(dirname , 0 , sizeof(dirname));
          strcpy(dirname , tempdir);
          strcat(dirname , dt->d_name);
          
          if(lstat(dirname,   &s)   <   0)
          {   
           printf("lstat   error:%s, stack.top = %d\n",dirname,stack.top);
           return ;   
          }  
          if(S_ISDIR(s.st_mode))
          {
          	if(chdir("..")   <   0)
            {   
             printf("chdir   error\n");   
             return ;   
            } 
          	strcpy(dirname+strlen(dirname), "/");            
            push(dirname);                 
          }                   
          else
          {   
           printf("%s\n",   dirname);
           count++;        
          } 
        }                //end for while((dt   =   readdir(dir))   !=   NULL) 
        closedir(dir);
      }                  //end for while(!isempty())    
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -