고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 3 – 디렉터리 다루기

고급 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 프로그래밍을 훨씬 더 강력하게 만들어줍니다.

🎯 “파일은 데이터의 본문,
디렉터리는 데이터의 목차!”

다음 단계에서는 디렉터리 탐색을 활용한 파일 필터링,
파일 백업 도구 만들기 프로젝트 예제로 이어서 응용력을 키워볼 거예요!
함께 디렉터리 마스터가 되어보자구요! 💪📂💻

답글 남기기