2012. 7. 13. 16:41

#include <stdio.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>

//define BUFSIZ 1024
main(int argc, char *argv[])
{
        void        fatal(char *);
        int        fd;
        DIR        *dir;
        char        file[BUFSIZ + 1];
        struct        dirent        *directory;
        struct        stat        file_stat;


        if(argc != 2)
                {
                puts("사용법 : a.out directory_name");
                exit(0);
                }

        if((dir = opendir(argv[1])) == NULL)
                fatal("opendir");

        while(directory = readdir(dir))
                {
                if(strcmp(directory->d_name, ".") == 0 ||
                        strcmp(directory->d_name, "..") == 0)
                        continue;
                if(directory->d_ino == 0)//삭제된 파일이면
                        continue;

                sprintf(file, "%s/%s", argv[1], directory->d_name);
                printf(directory->d_name);

                if(lstat(file, &file_stat) < 0)//파일의 상태를 얻음
                        fatal("stat");
                //stat()는 심볼릭 링크 파일을 발견하면 그 파일을 찾아가서
                //정보를 반환하지만 lstat()는 심볼릭링크 자체에대한 정보를
                //반환한다
                

                //S_IFMT 0xF0000
                //즉 아래는 상위 4bit만 읽겠다는 의미이다
                switch(file_stat.st_mode & S_IFMT)//파일의 속성 파악
                        {
                        case    S_IFDIR : putchar('/'); break;
                        case    S_IFIFO : putchar('|'); break;
                        case    S_IFLNK : putchar('@'); break;
                        }
                
                //실행 가능한 일반 파일인지 검사
                if((file_stat.st_mode & S_IFMT) == S_IFREG)//정규파일이면
                        if(file_stat.st_mode & S_IEXEC)//실행가능하면
                                putchar('*');

                putchar('\t');

                }

        putchar('\n');
        closedir(dir);
}

void
fatal(char *error_name)
{
        perror(error_name);
        exit(1);
}

Posted by 몰라욧