C & Docker & LINUX

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

로픽 2016. 10. 8. 14:24
300x250

리눅스 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);

}

 

<출력 결과>

리눅스

반응형