?? 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 + -