고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 3편: 디렉터리 다루기
안녕하세요! 😊
오늘은 C 언어로 디렉터리(폴더)를 다루는 방법에 대해 알아보겠습니다.
지금까지 파일을 읽고 쓰는 것에 집중했다면,
이제는 파일이 담겨 있는 폴더 자체를 어떻게 열고 탐색하고 조작할 수 있는지 알아볼 시간이에요!
📁 디렉터리는 마치 책꽂이 같은 존재예요.
책(파일)도 중요하지만, 어떤 책꽂이에 있는지도 관리해야겠죠?
1. 디렉터리란 무엇인가요?
-
디렉터리는 파일들을 분류하여 저장하는 공간입니다.
-
대부분의 운영체제에서는 계층적 구조로 되어 있으며,
디렉터리 안에 디렉터리를 만들 수도 있어요. (서브 디렉터리)
예:
C:/Users/홍길동/Documents/logs/
2. C 언어에서 디렉터리 다루기 – POSIX와 Windows 차이
-
POSIX 계열 (리눅스, macOS):
<dirent.h>
사용 -
Windows:
<windows.h>
또는_findfirst
,_findnext
함수 사용
💡 오늘은 POSIX 계열 기준으로 설명드릴게요.
Windows용 예제도 같이 소개해 드릴게요!
3. POSIX 방식 – <dirent.h>
이용하기 (리눅스/macOS)
디렉터리 열기: opendir()
c복사편집DIR *opendir(const char *name);
-
디렉터리를 열고 탐색할 준비를 합니다.
-
성공 시
DIR*
반환, 실패 시NULL
-
-
디렉터리 읽기: readdir()
c복사편집struct dirent *readdir(DIR *dirp);
-
디렉터리 내의 항목(파일, 서브디렉터리 등)을 하나씩 반환
-
모든 항목을 읽으면
NULL
반환 -
-
디렉터리 닫기: closedir()
c복사편집int closedir(DIR *dirp);
-
디렉터리를 닫고 자원 해제
-
-
전체 예제
c복사편집#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dp;
struct dirent *entry;
dp = opendir(".");
if (dp == NULL) {
perror("디렉터리 열기 실패");
return 1;
}
printf("현재 디렉터리 내 파일 목록:
");
while ((entry = readdir(dp)) != NULL) {
printf(" - %s
", entry->d_name);
}
closedir(dp);
return 0;
}
✅
.
은 현재 디렉터리,..
은 상위 디렉터리
이 둘은 특별한 이름이므로 필터링 시 제외할 수 있어요.
4. 디렉터리 내 항목 종류 확인하기
c복사편집#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
c복사편집struct stat st;
stat("파일경로", &st);
if (S_ISDIR(st.st_mode)) {
printf("디렉터리입니다.
");
} else if (S_ISREG(st.st_mode)) {
printf("일반 파일입니다.
");
}
-
S_ISDIR()
→ 디렉터리인지 확인 -
S_ISREG()
→ 일반 파일인지 확인
🔍 파일인지 디렉터리인지 구분할 수 있으면
재귀적으로 디렉터리 탐색도 가능합니다!
5. 디렉터리 만들기와 삭제하기
1) 디렉터리 생성: mkdir()
c복사편집#include <sys/stat.h>
mkdir("new_folder", 0755); // 권한 포함
-
0755는 읽기/실행 권한 포함된 기본 권한
-
-
2) 디렉터리 삭제: rmdir()
c복사편집rmdir("old_folder");
- 폴더가 비어있을 때만 삭제 가능!
❗ 파일이 들어 있으면 삭제 실패합니다.
6. Windows에서 디렉터리 다루기 (windows.h
)
c복사편집#include <windows.h>
int main() {
WIN32_FIND_DATA findFileData;
HANDLE hFind = FindFirstFile("C:\\Users\\홍길동\\*.txt", &findFileData);
if (hFind == INVALID_HANDLE_VALUE) {
printf("파일을 찾을 수 없습니다.
");
return 1;
}
do {
printf("파일명: %s
", findFileData.cFileName);
} while (FindNextFile(hFind, &findFileData) != 0);
FindClose(hFind);
return 0;
}
Windows에서는
FindFirstFile
,FindNextFile
조합으로 디렉터리 탐색을 합니다.
7. 디렉터리 관련 유용한 응용
1) 디렉터리 안의 파일 이름을 배열에 저장
c복사편집char filenames[100][256]; // 최대 100개 파일
int count = 0;
while ((entry = readdir(dp)) != NULL) {
if (entry->d_name[0] == '.') continue; // 숨김 파일 제외
strcpy(filenames[count++], entry->d_name);
}
2) 파일 확장자 필터링
c복사편집if (strstr(entry->d_name, ".txt")) {
printf("텍스트 파일: %s
", entry->d_name);
}
텍스트 파일만 따로 출력하거나 처리할 수 있어요.
8. 디렉터리 다루기의 실전 활용 예시
-
ls
명령어 만들기 -
사진/음악 폴더 자동 정리 프로그램
-
백업 도구 만들기
-
재귀 탐색을 이용한 전체 디렉터리 검색
-
-
✅ 요약 정리
기능
함수 (POSIX)
함수 (Windows)
디렉터리 열기
opendir()
FindFirstFile()
항목 읽기
readdir()
FindNextFile()
디렉터리 닫기
closedir()
FindClose()
디렉터리 생성
mkdir()
CreateDirectory()
디렉터리 삭제
rmdir()
RemoveDirectory()
9. 주의사항 정리
주의점
설명
readdir()
는 숨김 파일 포함
.
..
또는 .
로 시작하는 파일 필터링 필요
rmdir()
는 비어있어야 삭제 가능
내부 파일 먼저 삭제 후 폴더 삭제
플랫폼 의존성
POSIX와 Windows는 API 다름
구조체 접근 시 entry->d_name
주의
문자열 복사할 땐 strcpy()
사용
마무리하며 💬
디렉터리를 다루는 건 파일 시스템의 구조와 흐름을 제어하는 힘을 가지는 것과 같아요.
단순히 파일 하나 읽고 쓰는 걸 넘어서,
디렉터리를 순회하며 데이터를 정리하고 분석할 수 있는 능력은
C 프로그래밍을 훨씬 더 강력하게 만들어줍니다.
🎯 “파일은 데이터의 본문,
디렉터리는 데이터의 목차!”
다음 단계에서는 디렉터리 탐색을 활용한 파일 필터링,
파일 백업 도구 만들기 프로젝트 예제로 이어서 응용력을 키워볼 거예요!
함께 디렉터리 마스터가 되어보자구요! 💪📂💻