반응형
디렉토리 정보 검색
- 디렉토리 열기 : 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 등등 여러 경우의 수로 나온다.
실행 결과
반응형
'Programming > C/C++' 카테고리의 다른 글
C/Symbolic Execution/KLEE Tutorials 1-2 Anaylsis (0) | 2018.01.17 |
---|---|
C/리눅스 어셈블리 프로그래밍 - 1 (0) | 2017.12.15 |
C/Linux/디렉토리 관련 함수 (0) | 2017.11.09 |
C/Linux/심볼릭 링크 정보 검색 (0) | 2017.11.09 |
C/Linux/링크 파일 생성 (0) | 2017.11.09 |