[program] scandir()

development 2011. 10. 26. 13:42
scandir 

scandir() 은 디렉토리를 스캔하는 api 입니다.
처음 보면 어떻게 사용하는지 알아보기 어렵지만 조금만 해 보면 아주 간단한 api 입니다.

함수원형

#include <dirent.h>

scandir(const char *dirp,
          struct dirent **namelist,
          int(*filter)(const struct dirent *),
          int(*compar)(cont struct dirent **, const struct dirent **)); 


보시다시피 아주 복잡하게 되어 있습니다. 함수 포인터를 사용해 보신 분이라면 쉽게 이해가 되실 겁니다. 

다시 설명하면

 const char *dirp    => 검색할 디렉토리 지정                     
 struct dirent **namelist  => 검색결과 저장할 dirent 구조체 지정
 int(*filter)(const struct dirent *) => 필터 함수 사용할 경우, 사용할 필터 함수 지정
 int(*compar)(cont struct dirent **, const struct dirent **) => sort 함수 지정할 경우, 사용할 sort 함수 지정



1. 가장 기본적인 사용예제
  필터 함수 사용 : filter()  => 직접 만든 함수
  소트 함수 사용 : alphasort() => 미리 제공되는 시스템 함수
  
#include <dirent.h>

/* ".", ".." 은 빼고 나머지 파일명 출력하는 필터 함수 */
ᅟstatic int filter(const struct dirent *dirent)
{
  if(!(strcmp(dirent->d_name, ".")) ||
     !(strcmp(dirent->d_name, ".."))){
     /* 현재 디렉토리, 이전 디렉토리 표시는 출력안함 */
   }else{
    printf("   %s() : %s\n", __FUNCTION__, dirent->d_name);
   }
}

int main(int argc, char *argv[])
{
  int ret = 0;
  struct dirent **filelist;

  ret = scandir(".", &filelist, *filter, alphasort);

  return 0;
}


2. 필터 함수 사용 안할 경우
  소트 함수 사용 : alphasort() => 미리 제공되는 시스템 함수

  필터 함수를 사용안할 경우 리턴값은 디렉토리 엔트리의 갯수입니다. 
  
#include <dirent.h>

int main(int argc, char *argv[])
{
  int ret = 0;
  int i;
  struct dirent **filelist;

  ret = scandir(".", NULL, *filter, alphasort);

  for(i=0;i<ret;i++){
    printf("  %s() : %s\n", __FUNCTION__, filelist[i].d_name);
  }

  return 0;
}


3. sort 함수 사용 안할 경우
  필터 함수를 사용안할 경우 리턴값은 디렉토리 엔트리의 갯수입니다. 
  
#include <dirent.h>

int main(int argc, char *argv[])
{
  int ret = 0;
  int i;
  struct dirent **filelist;

  ret = scandir(".", NULL, *filter, NULL);

  for(i=0;i<ret;i++){
    printf("  %s() : %s\n", __FUNCTION__, filelist[i].d_name);
  }

  return 0;
}


'development' 카테고리의 다른 글

[program] memmove  (0) 2011.10.27
[kernel] struct list_head  (0) 2011.10.26
[program] scandir()  (0) 2011.10.26
[kernel] 커널 컴파일 완료후 꼭 해줘야 하는것.  (0) 2011.10.21
[kernel] print_hex_dump() api  (0) 2011.10.21
[crypto] RFC 3602(AES-CBC 암호화)  (0) 2011.10.20
블로그 이미지

김유석0

Tag ,

댓글을 달아 주세요