본문 바로가기

Programming/C/C++

C/Linux/디렉토리 정보 검색

반응형
디렉토리 정보 검색
- 디렉토리 열기 : opendir(3)

  • 성공하면 열린 디렉토리를 가리키는 DIR 포인터를 리턴
- 디렉토리 닫기 : closedir(3)
- 디렉토리 정보 읽기 : readdir(3)
  • 디렉토리의 내용을 한 번에 하나씩 읽어옴
디렉토리 열고 정보 읽기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
 
int main(void) {
    DIR *dp;
    struct dirent *dent;
 
    if ((dp = opendir("hanbit")) == NULL) {
        perror("opendir : hanbit");
        exit(1);
    }
 
    while ((dent = readdir(dp))) {
        printf("Name : %s ", dent->d_name);
        printf("Inode : %d\n", (int)dent->d_ino);
    }
 
    closedir(dp);
 
    return 0;
}


실행결과

디렉토리 항목의 상세 정보 검색
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
 
int main(void) {
    DIR *dp;
    struct dirent *dent;
    struct stat sbuf;
    char  path[BUFSIZ];
 
    if ((dp = opendir("hanbit")) == NULL ) {
        perror("opendir : hanbit");
        exit(1);
    }
 
    while ((dent = readdir(dp))) {
        if (dent->d_name[0== '.'continue;
        else break;
    }
    sprintf(path, "hanbit/%s", dent->d_name);
    stat(path, &sbuf);
 
    printf("Name : %s\n", dent->d_name);
    printf("Inode(dirent) : %d\n", (int)dent->d_ino);
    printf("Inode(stat) : %d\n", (int)sbuf.st_ino);
    printf("Mode : %o\n", (unsigned int)sbuf.st_mode);
    printf("Uid : %d\n", (int)sbuf.st_uid);
 
    closedir(dp);
 
    return 0;
}

실행 결과

- 디렉토리 오프셋 : telldir(3), seekdir(3), rewinddir(3)
  • telldir : 디렉토리 오프셋의 현재 위치를 알려준다.
  • seekdir : 디렉토리 오프셋을 loc에 지정한 위치로 이동시킨다.
  • rewinddir : 디렉토리 오프셋을 디렉토리의 시작인 0으로 이동시킨다.

디렉토리 오프셋 변화 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
 
int main(void) {
    DIR *dp;
    struct dirent *dent;
 
    if ((dp = opendir("hanbit")) == NULL) {
        perror("opendir");
        exit(1);
    }
    printf("** Directory content **\n");
    printf("Start Offset : %ld\n", telldir(dp));
    while ((dent = readdir(dp))) {
        printf("Read dent : %s   ", dent);
        printf("Read : %s ", dent->d_name);
        printf("Cur Offset : %ld\n", telldir(dp));
    }
    
    printf("** Directory Pointer Rewind **\n");
    rewinddir(dp);
    printf("Cur Offset : %ld\n", telldir(dp));
    
    printf("** Move Directory Pointer **\n");
    seekdir(dp, 6);
    printf("Cur Offset : %ld\n", telldir(dp));
    
    dent = readdir(dp);
    printf("Read %s   ", dent->d_name);
    printf("Next Offset : %ld\n", telldir(dp));
    rewinddir(dp);
    int i=0;
    while(i < 32) {
        seekdir(dp,i);
        dent = readdir(dp);
        printf("[%d] Read struct : %s   ",i, dent);
        printf("Read name : %s   ", dent->d_name);
        printf("Cur Offset : %ld\n", telldir(dp));
        i++;
    }
    
 
 
    closedir(dp);
    return(0);
}

  • 디렉터리안의 오프셋이 임의적으로 나옴. 실행했을 때 4, 6으로 나왔지만 12 24, 10 20 등등 여러 경우의 수로 나온다.
실행 결과


반응형