본문 바로가기
C & Docker & LINUX

리눅스 C언어 (파일 목록 읽어내기)

by 로픽 2016. 10. 8.
반응형

리눅스 C언어 (파일 목록 읽어내기)

리눅스 디렉터리 구조체 struct dirent

 

헤더 파일 dirent.h에는 디렉터리의 구조를 구조체 dirent로 정의하고 있다.

struct dirent {
  long     d_ino;        //I-노드 번호
  off_t        d_off;        //offset
  unsigned short d_reclen;        //파일 이름 길이
  char         d_name[NAME_MAX+1];        //파일 이름
}

 

디렉터리 파일을 읽어 내려면 단순히 파일을 열어 저장된 구조체를 하나씩 읽으면 된다.

삭제된 파일의 i-노드 번호가 0이 된다.

 

opendir 함수는 변수 dirname에 지정된 디렉토리 스트림을 열어 처음을 가리킨다.

 

함수

#include <dirent.h>
DIR *opendir(const char *dirname);

 

반환값

 - 성공 시 : 디렉토리 스트림의 포인터

 - 실패 시 : NULL

 

 

reanddir 함수는 dirp가 가리키는 디렉토리 내 파일 목록의 주소를 반환하고, dirp는 다음 파일목록으로 이동한다.

삭제한 파일 i-node 0 파일은 파일목록의 출력을 하면 안된다.

 

함수

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

 

반환값

 - 성공 시 : 파일 정보가 담긴 dirent 구조체

 - 실패 시 : NULL

 

closedir 함수는 디렉토리 파일을 닫아 준다.

 

함수

#include <dirent.h>
int closedir(DIR* dp);

 

반환값

 - 성공 시 : 0 

 - 실패 시 : -1

 

<코드>

#include<dirent.h>
#include<stdio.h>

DIR *dp;
struct dirent *dir;

main()
{

    if((dp = opendir(".")) == NULL){

      fprintf(stderr,"directory open error\n");

      exit(-1);

  	}



    while((dir = readdir(dp)) != NULL){

      if(dir->d_ino == 0) continue;

      printf("파일이름 : %s\t, I-node : %d\n", dir->d_name, dir->d_ino);

    }

    closedir(dp);

}

 

<출력 결과>

리눅스

반응형