반응형
rmdirs()
int rmdirs(const char *path, int force)
path가 파일이면 파일을 삭제하고, path가 directory이면 그 하위의 모든 directory와 파일을 삭제합니다.
UNIX/LINUX에서는 directory를 삭제하는 함수는 rmdir(2)이 있습니다. 그러나 directory가 비어있지 않으면 삭제할 수 없습니다. 따라서 directory 및 하위의 모든 directory/파일을 지우기 위해서는 directory의 모든 파일을 검색해서 일일이 파일을 unlink(2)로 삭제하고 파일이 모두 지워지면 디렉토리를 rmdir(2)로 삭제해야 합니다.
아래에 구현한 rmdirs 함수는 UNIX/LINUX 명령어인 rm -rf path와 같이 디렉토리가 비어있든 그렇지 않든 전체를 삭제합니다.
파라미터
path
- 삭제할 파일 또는 일괄로 삭제할 디렉토리
force
- 삭제시 권한 문제 등으로 파일을 삭제할 수 없다는 파일이 있을 때에 어떻게 할 것인지에 대한 옵션입니다.
- 파일 또는 directory를 삭제하다가 최초의 오류가 발생하면 멈출것인지,
아니면 오류난 것은 오류난 대로 두고 삭제할 수 있는 것은 모두 삭제합니다.
0이면 : 최초 오류 발생시 중지
0이 아니면 : 오류가 발생하더라도 나머지는 계속 삭제함
RETURN
0
- 정상적으로 path 하위의 모든 파일 및 모든 디렉토리를 삭제하였습니다.
-1
- 오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다.
소스 구현
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
int rmdirs(const char *path, int force)
{
DIR * dir_ptr = NULL;
struct dirent *file = NULL;
struct stat buf;
char filename[1024];
/* 목록을 읽을 디렉토리명으로 DIR *를 return 받습니다. */
if((dir_ptr = opendir(path)) == NULL) {
/* path가 디렉토리가 아니라면 삭제하고 종료합니다. */
return unlink(path);
}
/* 디렉토리의 처음부터 파일 또는 디렉토리명을 순서대로 한개씩 읽습니다. */
while((file = readdir(dir_ptr)) != NULL) {
// readdir 읽혀진 파일명 중에 현재 디렉토리를 나타네는 . 도 포함되어 있으므로
// 무한 반복에 빠지지 않으려면 파일명이 . 이면 skip 해야 함
if(strcmp(file->d_name, ".") == 0 || strcmp(file->d_name, "..") == 0) {
continue;
}
sprintf(filename, "%s/%s", path, file->d_name);
/* 파일의 속성(파일의 유형, 크기, 생성/변경 시간 등을 얻기 위하여 */
if(lstat(filename, &buf) == -1) {
continue;
}
if(S_ISDIR(buf.st_mode)) { // 검색된 이름의 속성이 디렉토리이면
/* 검색된 파일이 directory이면 재귀호출로 하위 디렉토리를 다시 검색 */
if(rmdirs(filename, force) == -1 && !force) {
return -1;
}
} else if(S_ISREG(buf.st_mode) || S_ISLNK(buf.st_mode)) { // 일반파일 또는 symbolic link 이면
if(unlink(filename) == -1 && !force) {
return -1;
}
}
}
/* open된 directory 정보를 close 합니다. */
closedir(dir_ptr);
return rmdir(path);
}
Sample 1. 디렉토리 전체 삭제
/* 디렉토리 하위의 모든 파일 및 디렉토리를 삭제하다가 오류가
* 발생하더라도 오류가 발생하지 않는 것은 삭제합니다.
*/
int main(int argc, char *argv[])
{
return rmdirs("./backup", 1);
}
Sample 2. 디렉토리 삭제중 오류 발생시 중단
/* 디렉토리 하위의 모든 파일 및 디렉토리를 삭제하다가 오류가 발생하면 중단합니다.*/
int main(int argc, char *argv[])
{
return rmdirs("./backup", 0);
}
Source Download :
반응형
'C언어 응용 > 활용' 카테고리의 다른 글
log 생성 API 구현 (0) | 2019.10.04 |
---|---|
copy_file( ) - 원본 파일의 속성까지 복사하기 (0) | 2019.10.04 |
strncpy시에 한글 반잘림 오류 방지 (0) | 2019.10.04 |
mkdirs( ) - 계층구조 디렉토리 한번에 만들기 (0) | 2019.10.04 |
CRC (Cyclic Redundancy Check) (0) | 2019.10.01 |