1 분 소요

TREE를 만들어 보는중….

필요한것들..

getcwd (현재 디렉토리 읽기)

opendir

readdir

dirent type

closedir

character map 활용해서 특정 ascii (extended ascii codes)문자를  카피해서 쓸수 있음 ㅡ.ㅡ;

  1. 현재 디렉토리를 읽어온다.

  2. 디렉토리 아래에 있는 내용들을 읽는다.

  3. 내용을 소팅한다.

  4. 소팅후 디렉토리의 경우 안으로 들어가서 디렉토리 안에 있는 내용을 읽어서 다시 소팅하고 프린트 한다.

  5. 각 타입에 따라 색을 달리해서 출력을 한다.

움.. 대충짠 코드 ㅡ.ㅡ;

#include

#include

#include

#include

#include <sys/types.h>

#include

int depth = 0;

int depth_tmp = 0;

void cmd_p(char * cmd)

{

system(cmd);

}

#define BRIGHT 1

#define RED 31

#define BLUE 34

#define BG_BLACK 40

void print_set_color(int color)

{

printf(“%c[%d;%d;%dm”, 0x1B, BRIGHT, color, BG_BLACK );

}

void print_clear_color(void)

{

printf(“%c[%dm”, 0x1B, 0);

}

void print_depth(int dep)

{

int i = 0;

if(dep == 0)

{

printf(“%c”,124);

printf(“–”);

}

if(dep > 0)

{

for( i; i <= (dep-1); i ++)

{

printf(“%c”,124);

printf(“  ”);

}

printf(“%c”,124);

printf(“–”);

}

}

int check_ascii(char data)

{

if((data >= 97) && (data <= 122))

return data - 32;

}

void data_sorting(struct dirent *dir_data, int size)

{

int i = 0;

int j = 0;

for(j = 0; j < size - 1; j++)

{

for(i = 0; i < size - 1; i ++)

{

if(check_ascii(dir_data[i].d_name[0]) > check_ascii(dir_data[i+1].d_name[0]))

{

dir_data[1023] = dir_data[i];

dir_data[i] = dir_data[i+1];

dir_data[i+1] =  dir_data[1023];

}else if(check_ascii(dir_data[i].d_name[0]) == check_ascii(dir_data[i+1].d_name[0]))

{

if(check_ascii(dir_data[i].d_name[1]) > check_ascii(dir_data[i+1].d_name[1]))

{

dir_data[1023] = dir_data[i];

dir_data[i] = dir_data[i+1];

dir_data[i+1] =  dir_data[1023];

}else if(check_ascii(dir_data[i].d_name[1]) == check_ascii(dir_data[i+1].d_name[1]))

{

if(check_ascii(dir_data[i].d_name[2]) > check_ascii(dir_data[i+1].d_name[2]))

{

dir_data[1023] = dir_data[i];

dir_data[i] = dir_data[i+1];

dir_data[i+1] =  dir_data[1023];

}

}

}

}

}

}

void print_current(char * buff_dir)

{

struct dirent *entry = NULL;

struct dirent dir_data[1024];

DIR *current_dir = opendir(buff_dir);

char tmp_buff[1024]={0,};

int i = 0, j = 0, i_max = 0;

while((entry = readdir(current_dir)))

{

dir_data[i].d_type = entry->d_type;

memcpy(dir_data[i].d_name, entry->d_name, sizeof(entry->d_name));

i++;

}

closedir(current_dir);

i_max =  i;

data_sorting(dir_data, i_max);

for(i=0; i < i_max ; i++)

{

if(dir_data[i].d_type == 4)

{

if(strcmp(dir_data[i].d_name, “.”) && strcmp(dir_data[i].d_name, “..”))

{

print_depth(depth);

print_set_color(BLUE);

printf(“%s \n”, dir_data[i].d_name);

print_clear_color();

memset(tmp_buff, 0, 1024*sizeof(char));

strcpy(tmp_buff, buff_dir);

strcat(tmp_buff, “/”);

strcat(tmp_buff, dir_data[i].d_name);

depth ++;

print_current(tmp_buff);

depth –;

}

}

else if(dir_data[i].d_type == 8)

{

print_depth(depth);

printf(“%s \n”, dir_data[i].d_name);

}

}

}

void main(int argc, char **argv)

{

char buff[1024];

getcwd(buff, 1024);  //getcwd : read current directory.

printf(“current directory : %s \n”, buff);

print_current(buff);

}

\