C에서 opendir 함수 사용

Jinku Hu 2023년10월12일
  1. opendir기능을 사용하여 디렉토리 스트림 열기
  2. readdir함수를 사용하여 디렉토리 항목 반복
C에서 opendir 함수 사용

이 기사에서는 C에서opendir함수를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

opendir기능을 사용하여 디렉토리 스트림 열기

opendir함수는 POSIX 사양의 일부이며<dirent.h>헤더 파일에 정의되어 있습니다. 이 함수는 단일char포인터 인수를 사용하여 열 디렉토리 이름을 지정합니다. opendirDIR*구조를 반환하거나 오류가 발생하면NULL을 반환합니다. DIR데이터 유형은 디렉토리 스트림을 나타 내기 위해 구현되지만 사용자는DIR유형의 오브젝트를 할당해서는 안됩니다. 다음 예제 코드에서는 첫 번째 명령 줄 인수에서 디렉터리 이름을 가져와opendir함수에 값을 전달합니다.

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

int main(int argc, char *argv[]) {
  DIR *dp;
  struct dirent *dirp;

  if (argc != 2) {
    fprintf(stderr, "Usage: ./program directory_name\n");
    exit(EXIT_FAILURE);
  }

  dp = opendir(argv[1]);

  while ((dirp = readdir(dp)) != NULL) printf("%s\n", dirp->d_name);

  closedir(dp);
  exit(EXIT_SUCCESS);
}

readdir함수를 사용하여 디렉토리 항목 반복

디렉토리 스트림이 열리고 유효한DIR*을 검색하면readdir함수를 사용하여 그 안의 각 항목을 읽을 수 있습니다. readdir함수에 대한 각 호출은 다음 디렉토리 항목을 나타내는dirent구조에 대한 포인터를 리턴합니다. 디렉토리 스트림의 끝에 도달하면readdirNULL을 반환합니다. 따라서 열린 디렉토리 스트림의 모든 항목을 인쇄하는 간단한while루프를 구현했습니다. opendirclosedir함수 호출 주변의 코드를 수정하여 오류를 확인하고 디버깅을 위해 해당 메시지를 출력했습니다. 라이브러리 함수가 성공적으로 반환되었는지 확인하는 것은 항상 안전하고 좋은 방법입니다.

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

int main(int argc, char *argv[]) {
  DIR *dp;
  struct dirent *dirp;

  if (argc != 2) {
    fprintf(stderr, "Usage: ./program directory_name\n");
    exit(EXIT_FAILURE);
  }

  errno = 0;
  if ((dp = opendir(argv[1])) == NULL) {
    switch (errno) {
      case EACCES:
        printf("Permission denied\n");
        break;
      case ENOENT:
        printf("Directory does not exist\n");
        break;
      case ENOTDIR:
        printf("'%s' is not a directory\n", argv[1]);
        break;
    }
    exit(EXIT_FAILURE);
  }

  while ((dirp = readdir(dp)) != NULL) printf("%s\n", dirp->d_name);

  if (closedir(dp) == -1) perror("closedir");

  exit(EXIT_SUCCESS);
}

또는readdir함수에 대한 오류 검사 조건문을 추가 할 수 있습니다. 이전 예제는 디렉토리 이름이 유효하지 않거나 다른 오류가 발생했을 때 명확하지 않은 출력을 생성 할 수 있기 때문입니다. 다음 코드는 성공적인 반복 후 디렉토리 끝 도달 상태를 추가로 출력합니다.

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

int main(int argc, char *argv[]) {
  DIR *dp;
  struct dirent *dirp;

  if (argc != 2) {
    fprintf(stderr, "Usage: ./program directory_name\n");
    exit(EXIT_FAILURE);
  }

  errno = 0;
  if ((dp = opendir(argv[1])) == NULL) {
    switch (errno) {
      case EACCES:
        printf("Permission denied\n");
        break;
      case ENOENT:
        printf("Directory does not exist\n");
        break;
      case ENOTDIR:
        printf("'%s' is not a directory\n", argv[1]);
        break;
    }
    exit(EXIT_FAILURE);
  }

  errno = 0;
  while ((dirp = readdir(dp)) != NULL) printf("%s\n", dirp->d_name);

  if (errno != 0) {
    if (errno == EBADF)
      printf("Invalid directory stream descriptor\n");
    else
      perror("readdir");
  } else {
    printf("End-of-directory reached\n");
  }

  if (closedir(dp) == -1) perror("closedir");

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C File