리눅스 프로그래밍 - 디렉토리 열기, 디렉토리 내 파일 접근하기
- 카테고리 없음
- 2020. 5. 28.
반응형
리눅스 프로그래밍 - 디렉토리 열기, 디렉토리 내 파일 접근하기
본 글에서는 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() 함수를 이용하면 특정 디렉토리를 열어 그 안에 저장되어 있는 하위 디렉토리, 파일들에 접근할 수 있다. 파일의 경로명을 알게 되면 파일을 열거나 쓰거나 하는 동작을 수행할 수 있을 것이다.
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음