[리눅스 시스템 프로그래밍] 6.3 디렉토리 생성과 제거, mkdir, rmdir

리눅스 시스템에서는 디렉토리를 생성하는 mkdir, 제거하는 rmdir 시스템 호출을 제공하고 있어요.

#include <sys/types.h >

#incldue <sys/stat.h>

int mkdir(const char *path, mode_t mode);

int rmdir(const char *path);

반환 값: 실패 시 -1, 성공 시 0

mkdir 함수 호출 결과가 성공일 때 새로운 디렉토리가 만들어지고 디렉토리 파일에는 자기 자신(.)과 이전 디렉토리(..)에 관한 디렉토리 엔트리 정보를 기록합니다. 그리고 rmdir은 비워있지 않을 때에 성공합니다.

다음은 main 함수에 인자로 전달받은 경로를 제거하는 예제 코드입니다. 만약 전달받은 경로가 디렉토리일 때에는 내부에 있는 파일 목록을 먼저 제거한 후에 자신을 제거합니다.

/**********************************************************************
* ex_remove.c                                                         *
* exmple source – delete file and directory                           *
**********************************************************************/
#include <linux/limits.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Remove(const char *path);
int main(int argc, char **argv)
{
    if(argc != 2)
    {
        fprintf(stderr, "Usage: %s <path name>\n", argv[0]);
        return 1;
    }

    Remove(argv[1]);
    return 0;
}

void Remove(const char *path)
{
    struct stat statbuf;
    if(stat(path, &statbuf)<0)
    {
        perror("stat error");
        exit(1);
    }

    if(S_ISDIR(statbuf.st_mode))
    {
        DIR *dir = opendir(path);
        struct dirent *de=NULL;


        while((de = readdir(dir))!=NULL)
        {
            if(strcmp(de->d_name,".")==0)
            {
                continue;
            }
            if(strcmp(de->d_name,"..")==0)
            {
                continue;
            }
            char npath[PATH_MAX];
            sprintf(npath,"%s/%s",path, de->d_name);
            Remove(npath);

        }
        closedir(dir);
        rmdir(path);
    }
    else
    {
        unlink(path);
    }
}
[그림 6.4] ex_remove 실행 화면
[그림 6.4] ex_remove 실행 화면