목차
- 디렉토리명 출력을 위한 printf 이전 포스팅
- 파일 출력을 위한 특정 디렉토리 경로 입력받기 예제
- 특정 디렉토리 열기 예제(opendir)
- 디렉토리 내에 모든 파일 경로 출력 예제(readdir)
- 디렉토리 닫기 및 결과 확인
디렉토리명 출력을 위한 printf 이전 포스팅
오늘 포스팅에서 주로 다루는 내용은 특정 디렉토리 내의 모든 파일들의 경로를 출력하는 것입니다. 여기서 C에서 문자열을 출력하는 방법에 대해 잘 알아야 이해가 쉽습니다. 특히 C는 문자열 출력을 하기위해서는 반드시 배열, 포인터에 대한 개념을 파악해야합니다. 이전 포스팅에서 C 포멧 문자열 출력 함수인 printf에 대해 자세히 다뤘습니다.
여러가지의 포멧을 이해하고 출력하는 방법을 이해해보세요.
아래는 관련 포스팅 링크입니다.
2020.07.03 - [C/stdio] - C/C++ printf 포멧 API 사용 예제(출력) - 1
파일 출력을 위한 특정 디렉토리 경로 입력받기 예제
자 이제 본격적으로 특정 디렉토리의 파일 목록을 출력하기에 앞서, 사용자로부터 파일 출력을 위한 특정 디렉토리 경로를 입력받는 코드를 아래와 같이 작성해보겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int main() {
char dirPath[100];
printf("디렉토리 경로를 입력하세요: ");
scanf("%s", dirPath);
printf("\n입력한 경로 : %s\n\n", dirPath);
return 0;
}
특정 디렉토리 열기 예제(opendir)
이제 위에서 입력받은 디렉토리를 opendir로 열어줍니다. C에서 opendir함수를 사용하면 해당 디렉토리의 정보를 처리할 수 있는 DIR 타입의 포인터를 반환합니다. 이후 이 포인터를 통해 내부 정보를 가져올 수 있습니다. 아래와 같이 코드를 작성합니다.
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int main() {
char dirPath[100];
printf("디렉토리 경로를 입력하세요: ");
scanf("%s", dirPath);
printf("\n입력한 경로 : %s\n\n", dirPath);
DIR *dir = opendir(dirPath);
if (dir == NULL) {
perror("디렉토리 열기 실패\n\n");
return;
} else {
printf("디렉토리 열기 성공\n\n");
}
return 0;
}
디렉토리 내에 모든 파일 경로 출력 예제(readdir)
이후 readdir 함수를 이용하여 해당 디렉토리의 정보를 가져옵니다. 본 예제에서는 파일 타입만 분별하여 파일명을 가져오겠습니다. 그리고 이 파일명을 앞서 입력받은 경로와 결합하여 해당 파일의 경로를 출력하는 코드를 작성하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int main() {
char dirPath[100];
printf("디렉토리 경로를 입력하세요: ");
scanf("%s", dirPath);
printf("\n입력한 경로 : %s\n\n", dirPath);
DIR *dir = opendir(dirPath);
if (dir == NULL) {
perror("디렉토리 열기 실패\n\n");
return;
} else {
printf("디렉토리 열기 성공\n\n");
}
{
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
// 파일인 경우만 출력
printf("%s/%s\n", dirPath, entry->d_name);
}
}
}
return 0;
}
디렉토리 닫기 및 결과 확인(closedir)
하지만 위 예제처럼 특정 디렉토리를 열은 후 읽기를 진행했다면 반드시 closedir로 디렉토리를 닫아주어야합니다. 안그러면 내부적으로 해당 리소스를 계속 사용하고 있기때문에 비효율적입니다. 아래의 closedir함수를 예제 마지막에 추가해줍니다.
{
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
// 파일인 경우만 출력
printf("%s/%s\n", dirPath, entry->d_name);
}
}
}
closedir(dir);
return 0;