📄 dir.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 + -