리눅스 프로그래밍 - 디렉토리 열기, 디렉토리 내 파일 접근하기

반응형

 

리눅스 프로그래밍 - 디렉토리 열기, 디렉토리 내 파일 접근하기

본 글에서는 C 언어를 이용하여 특정 디렉토리를 열고 해당 디렉토리 내에 있는 파일에 접근하는 방법을 정리한다.

 

이를 위해 사용되는 C 함수는 다음과 같다.

#include <sys/types.h>
#include <dirent.h>

// 특정 디렉토리를 여는 함수
// 리턴된 DIR에 대해 readdir() 함수를 호출하면 디렉토리 내 항목들을 읽을 수 있다.
DIR *opendir(const char *name);

// 특정 디렉토리 내 1건의 디렉토리/파일 등을 구하는 함수. 함수 호출 시마다 1건씩 리턴된다.
// 읽힌 디렉토리/파일명은 리턴되는 struct dirent 구조체 내 d_name 변수에 저장된다.
struct dirent *readdir(DIR *dir);

// opendir() 호출 시 반환된 DIR에 연관된 디렉토리를 닫는다.
int closedir(DIR *dir);

 

다음은 인자로 전달 받은 디렉토리를 연 후, 해당 디렉토리 안에 있는 각 파일들의 경로(디렉토리 경로 + 파일명)를 출력하는 예제 프로그램이다.

  • opendir() 함수로 디렉토리를 연다.
  • readdir() 함수로 디렉토리 내 파일명을 구한다.
  • 디렉토리 경로와 파일명을 결합하여 파일 경로를 구한다.
  • 파일 경로를 출력한다.
  • closedir() 함수로 디렉토리를 닫는다.

 

 

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/**
 * @brief 특정 디렉토리에 저장되어 있는 각 파일들의 경로명(디렉토리경로 + 파일명)을 출력한다.
 * @param[in] dir_path 파일들이 저장된 디렉토리 경로 (상대경로, 절대경로 모두 가능)
 * @retval 0: 성공
 * @retval -1: 실패
 */
int GetFilePathInDirecotry(const char *dir_path)
{
  printf("Get file path in directory %s\n", dir_path);

  /*
   * 디렉토리를 연다.
   */
  DIR *dir;
  struct dirent *ent;
  dir = opendir(dir_path);
  if (dir == NULL) {
    perror("opendir() failed ");
    return -1;
  }

#define MAXLINE 255
  /*
   * 각 파일의 경로명이 저장될 버퍼를 할당한다.
   */
  size_t file_path_size = strlen(dir_path) + MAXLINE;
  char *file_path = (char *)calloc(1, file_path_size);
  if (file_path == NULL) {
    perror("calloc(file_path) failed ");
    closedir(dir);
    return -1;
  }

  /*
   * 디렉토리 내 모든 파일들의 경로명을 화면에 출력한다.
   */
  while ((ent = readdir(dir)) != NULL)
  {
    // 파일의 경로를 구한다. (입력된 디렉터리명과 탐색된 파일명의 결합)
    memset(file_path, 0, file_path_size);
    strncpy(file_path, dir_path, strlen(dir_path));
    *(file_path + strlen(dir_path)) = '/';
    strcat(file_path, ent->d_name);

    printf("FILE: %s\n", file_path);
  }

  free(file_path);
  closedir(dir);
  return 0;
}


/**
 * @brief 테스트 메인 함수
 * @param[in] argc 실행 파라미터 개수
 * @param[in] argv 실행 파라미터(들)
 * @retval 0: 성공
 * @retval -1: 실패
 */
int main(int argc, char *argv[])
{
  return GetFilePathInDirecotry(argv[1]);
}

 

 

컴파일 후 실행하면 다음과 같은 결과가 출력된다.

root@0c6a0e7f3f25:/workspace/docker# gcc -o GetFilePathInDirectory GetFilePathInDirectory.c
root@0c6a0e7f3f25:/workspace/docker#
root@0c6a0e7f3f25:/workspace/docker# ./GetFilePathInDirectory .
Get file path in directory .
FILE: ./GetFilePathInDirectory
FILE: ./GetFilePathInDirectory.c
FILE: ./.
FILE: ./..
root@0c6a0e7f3f25:/workspace/docker# ./GetFilePathInDirectory /usr/bin
Get file path in directory /usr/bin
FILE: /usr/bin/.
FILE: /usr/bin/..
FILE: /usr/bin/loadunimap
FILE: /usr/bin/xargs
FILE: /usr/bin/nice
FILE: /usr/bin/perlthanks
FILE: /usr/bin/json_pp
FILE: /usr/bin/lesspipe
FILE: /usr/bin/debconf-copydb
FILE: /usr/bin/rename.ul
FILE: /usr/bin/reset

 

이와 같이 opendir() 함수와 readdir() 함수를 이용하면 특정 디렉토리를 열어 그 안에 저장되어 있는 하위 디렉토리, 파일들에 접근할 수 있다. 파일의 경로명을 알게 되면 파일을 열거나 쓰거나 하는 동작을 수행할 수 있을 것이다.

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

댓글

Designed by JB FACTORY