tree 만들기
TREE를 만들어 보는중….
필요한것들..
getcwd (현재 디렉토리 읽기)
opendir
readdir
dirent type
closedir
character map 활용해서 특정 ascii (extended ascii codes)문자를 카피해서 쓸수 있음 ㅡ.ㅡ;
-
현재 디렉토리를 읽어온다.
-
디렉토리 아래에 있는 내용들을 읽는다.
-
내용을 소팅한다.
-
소팅후 디렉토리의 경우 안으로 들어가서 디렉토리 안에 있는 내용을 읽어서 다시 소팅하고 프린트 한다.
-
각 타입에 따라 색을 달리해서 출력을 한다.
움.. 대충짠 코드 ㅡ.ㅡ;
#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);
}
\