본문 바로가기
Computer Science/UNIX & Linux

[UNIX/Linux] ep1+) 디렉터리 함수 실습

by 클레어몬트 2024. 9. 20.

ex1. mkdir() 함수를 사용해 디렉터리를 2개(dir1, dir2) 만들고, 이 중 dir1은 rmdir() 함수로 삭제하고 dir2는 rename() 함수를 사용해 testdir로 바꾸는 프로그램을 작성하시오. (mkdir->rmdir->rename)

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main() {
    if (mkdir("dir1", 0755) == -1) {
        perror("dir1");
        exit(1);
    }
    if (mkdir("dir2", 0755) == -1) {
        perror("dir2");
        exit(1);
    }

    if (rmdir("dir1") == -1) {
        perror("dir1");
        exit(1);
    }

    if (rename("dir2", "testdir") == -1) {
        perror("rename");
        exit(1);
    }

    return 0;
}

 

 

 

ex2. 현재 디렉터리를 기억하고 있다가 다른 디렉터리로 이동해 작업한 후 원래 디렉터리로 돌아오도록 프로그램을 작성하시오. (getcwd이용)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    char* owd; // owd: original working directory
    char* cwd; // cwd: current working directory

    // 현재 디렉터리를 기억
    owd = getcwd(NULL, BUFSIZ);
    printf("1. dir=%s\n", owd);

    // testdir 디렉터리로 이동
    chdir("testdir");
    cwd = getcwd(NULL, BUFSIZ);
    printf("** in dir:%s\n", cwd);

    // 다시 원래 디렉터리로 이동
    chdir(owd);
    cwd = getcwd(NULL, BUFSIZ);
    printf("2. dir=%s\n", cwd);
    free(owd);
    free(cwd);
    
    return 0;
}

실행 결과(testdir 디렉터리가 있는 경우)

 

 

 

ex3. 다음 코드에서 오류를 리턴할 때 처리하는 코드를 추가하시오.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // getcwd() 함수, chdir() 함수

int main() {
    char* cwd; // 현재 작업 디렉터리(current working directory)

    cwd = getcwd(NULL, BUFSIZ);
    printf("1.Current Directory: %s\n", cwd);

    chdir("dong"); // "dong" 디렉터리로 이동

    cwd = getcwd(NULL, BUFSIZ);
    printf("2.Current Directory: %s\n", cwd);
    free(cwd);
    
    return 0;
}
// 실행 결과: 디렉터리가 이동, 하지만 디렉터리 이동은 프로그램 내부에서만 진행된다
// 따라서 프로그램 종료 후, pwd 명령으로 보면 현재 디렉터리가 바뀐 것은 아님을 알 수 있음

 

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    char* cwd;

    cwd = getcwd(NULL, BUFSIZ);
    if (cwd == NULL) {
        perror("getcwd");
        exit(1);
    }
    printf("1. Current Directory:%s\n", cwd);

    int returnVal = chdir("dong");
    if (returnVal == -1) {
        perror("chdir");
        exit(1);
    }

    cwd = getcwd(NULL, BUFSIZ);
    if (cwd == NULL) {
        perror("getcwd");
        exit(1);
    }
    printf("2. Current Directory:%s\n", cwd);
    free(cwd);
    
    return 0;
}

실행 결과(dong 디렉터리가 있는 경우)

 

 

 

ex4. 디렉터리가 비어 있는지 확인한 후 디렉터리가 비어 있다는 메시지를 출력하고, 해당 디렉토리를 삭제하는 프로그램을 작성하시오.

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>

int main() {
    DIR* dp; // dp: directory pointer
    struct dirent* dent; // dent: directory entry

    dp = opendir("testdir");
    if (dp == NULL) {
        printf("testdir 디렉터리가 없음\n");
        exit(1);
    }

    int count = 0;
    while ((dent = readdir(dp))) {
        printf("name: %s / ", dent->d_name);
        printf("inode: %d\n", (int)dent->d_ino);
        count++;
    }
    closedir(dp);

    // '.', '..' 밖에 없으면 삭제
    if (count == 2) {
        rmdir("testdir");
    }
    
    return 0;
}

testdir 디렉터리가 삭제된 모습
testdir 디렉터리가 없는 경우

 

 

 

hw1. 디렉토리명을 명령행 인자로 입력받아 생성하고, 작업 디렉터리를 새로 생성한 디렉터리로 이동시키는 프로그램을 작성하시오.

* getcwd로 생성된 디렉터리로 이동했다는 것을 보여주어야 함

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        printf("Usage: prog_name dirname\n");
        exit(1);
    }

    mkdir(argv[1], 0755);
    chdir(argv[1]);

    char* cwd = getcwd(NULL, BUFSIZ);
    printf("** dir=%s\n", cwd);
    free(cwd);
    
    return 0;
}

hi 디렉터리를 생성한 모습

 

 

 

hw2. ‘.’과 ‘..’ 항목을 제외하고 디렉터리에 있는 파일이나 하위 디렉토리명을 출력하는 프로그램을 작성하시오.

* if (dent->d_name[0] != '.’) 이용

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        printf("Usage: prog_name dirname\n");
        exit(1);
    }

    DIR* dp = opendir(argv[1]);
    if (dp == NULL) {
        perror("opendir: ");
        exit(1);
    }

    struct dirent* dent;
    while(1) {
        dent = readdir(dp);
        if (dent == NULL) {
            break;
        }

        if (dent->d_name[0] != '.') {
            printf("name: %s\n", dent->d_name);
        }
    }
    closedir(dp);
    
    return 0;
}

testdir 디렉터리에 있는 파일과 디렉터리를 출력

 

 

 

hw3. 파일명을 명령행 인자로 입력받고 이 파일이 현재 디렉터리에 있는지 확인하는 프로그램을 작성하시오. (found !! / not found !!)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        printf("Usage: prog_name filename\n");
        exit(1);
    }

    DIR* dp = opendir("."); // . : 현재 디렉터리
    struct dirent* dent;
    int found = 0;
    while (1) {
        dent = readdir(dp);
        if (dent == NULL) {
            break;
        }

        if (strcmp(dent->d_name, argv[1]) == 0) {
            found = 1;
            break;
        }
    }

    closedir(dp);
    if (found) {
        printf("%s found !!\n", argv[1]);
        exit(0);
    }
    else {
        printf("%s not found !!\n", argv[1]);
        exit(1);
    }
    
    return 0;
}

testdir는 찾았지만 abcde123은 못찾은 모습

 

 

 

 

 

 

참고 및 출처: 시스템 프로그래밍 리눅스&유닉스(이종원)