ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ readdir(3)
    C,C++ & Linux 2020. 5. 20. 16:10
    728x90

    readdir(3) 함수 기능

    디렉토리 내부의 파일을 읽어들이는 함수입니다.

    함수 원형

    #include <dirent.h>
    
    struct dirent *readdir(DIR *dp);

    매개변수

    dp

    읽어들일 디렉토리의 DIR 포인터

    반환값

    성공 시 dirent* 리턴

    에러 시 NULL 리턴하고 errno 설정

     

    struct dirent 구조

    struct dirent {
        char d_name[256];			// 파일명
        ino_t d_ino;				// inode
        off_t d_off;				// 현재 디렉토리 DIR 스트림내에서의 위치(offset)
        unsigned short d_reclen;	// 레코드 길이
        unsigned char d_type;		// 파일의 타입
    };

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    
    #define DIRECTORY_SIZE MAXNAMLEN
    
    int main(int argc, char *argv[]) {
        struct dirent *dentry;
        struct stat statbuf;
        char filename[DIRECTORY_SIZE + 1];
        DIR *dirp;
    
        // argv[1] 디렉토리를 열고, 해당 디렉토리로 작업 디렉토리를 옮김
        if ((dirp = opendir(argv[1])) == NULL || chdir(argv[1]) == -1) {
            fprintf(stderr, "opendir, chdir error for %s\n", argv[1]);
            exit(1);
        }
    
        // argv[1]을 가리키는 dirp
        // dirp 를 readdir()하며 순회
        // 즉 argv[1] 내부에 있는 모든 파일을 읽어들임
        while ((dentry = readdir(dirp)) != NULL) {
            if (dentry->d_ino == 0)
                continue;
    
            // dentry->d_name : 파일명
            // filename 에 파일명 복사
            // 이때 중요한점은 filename에는 경로가 아닌 파일명만 복사된다는 것임
            // 따라서 mydir/test.c 가 아닌 test.c만 복사
            memcpy(filename, dentry->d_name, DIRECTORY_SIZE);
    
            // filename으로 해당 파일에 대한 정보를 뽑아냄
            // test.c 만으로 파일정보를 뽑아오기 위해 18번 라인에서 chdir을 한 것임
            if (stat(filename, &statbuf) == -1) {
                fprintf(stderr, "stat error for %s\n", filename);
                break;
            }
    
            // 일반 파일이면 파일명에 이어 크기까지 출력
            if ((statbuf.st_mode & S_IFMT) == S_IFREG)
                printf("%-14s %ld\n", filename, statbuf.st_size);
            else
                printf("%-14s\n", filename);
        }
    
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ closedir(3)  (0) 2020.05.20
    C/C++ rewinddir(3)  (0) 2020.05.20
    C/C++ opendir(3)  (0) 2020.05.20
    C/C++ rmdir(2)  (0) 2020.05.19
    C/C++ mkdir(2)  (0) 2020.05.19

    댓글

Designed by Tistory.