4-1 파일 기본 (과제-1)

3888 단어 APIAPI

과제-1 PrintName() 동적할당 문자열 free 수정필요
과제-2 chmod() 함수가 결과적으로 적용되지 않음 ... ch_mod 프로그램 진행중

과제 - 1

fileinfo

#include <stdio.h>
#include <sys/stat.h>   //lstat
#include <stdlib.h>     //malloc, free
#include <string.h>     //strcpy
#include <unistd.h>     //readlink

enum { COUNT_ERROR = -2, LSTAT_ERROR = -1 };

char* my_strtok(char* str, const char* delim)
{
    static char* str_copy = NULL;
    char* delim_copy = NULL;

    (str!=NULL) ? (str_copy=str) : (str=str_copy);

    if (*str_copy=='\0')
        return NULL;
    while (*str_copy){
        delim_copy = (char*)delim;
        while (*delim_copy){
            if (*str_copy == *delim_copy){
                *str_copy = '\0';
                str_copy++;
                return str;
            }
            delim_copy++;
            }
        str_copy++;
    }

    return 0;
//  return str; //맨마지막 구분자 뒤의 문자열을 출력하지 않기 위해 my_strtok 함수 사용
}

char* PrintName(char* path)
{
    int j = 0;

    char* name = malloc(sizeof(path));

    if (path != NULL) {
        strcpy(name, path);
        name = strrchr(name, '/');
    }

    for (int i = 0; i < (int)strlen(name); i++)
        if (name[i] != '/')
            name[j++] = name[i];
    name[j] = '\0'; 

    return name;
}

int main(int argc, char* argv[])
{
    if (argc != 2) {
        puts("하나의 파일을 입력해주세요.");
        return COUNT_ERROR;
    }

    struct stat file;

    if (lstat(argv[1], &file) == -1) {
        puts("파일을 읽을 수 없습니다.");
        return LSTAT_ERROR;
    }

    /* 파일 경로 */
    char* path = malloc(sizeof(argv[1]));
    if (argv[1] != NULL)
        strcpy(path, argv[1]);
    printf("path: ");
    char* temp = my_strtok(path, "/");
    while (temp != NULL) {
        printf("%s/", temp);
        temp = my_strtok(NULL, "/");
    }
    puts("");

    /* 파일명 */
    if (argv[1] != NULL)
        printf("file name: %s\n", PrintName(argv[1]));

    /* 심볼릭 링크일 경우, 원본 파일명 */
    if (S_ISLNK(file.st_mode)) {
        char buf[256];
        memset(buf, 0x00, 256);
        readlink(argv[1], buf, 256);

        printf("original file name: %s\n", PrintName(buf));
    }

    printf("inode num: %ld\n", file.st_ino);
    printf("user id: %d\n", file.st_uid);
    printf("group id: %d\n", file.st_gid);
    printf("size: %ld\n", file.st_size);

    /* 파일 타입 정보 */
    char* type;
    if (S_ISREG(file.st_mode))
        type = "regular file";
    else if (S_ISDIR(file.st_mode))
        type = "directory";
    else if (S_ISLNK(file.st_mode))
        type = "symbolic link";
    printf("type: %s\n", type);

    /* 파일 모드 정보 */
    char mode[12];
    memset(mode, '-', sizeof(mode));

    int setnum[12] = { 0x800, 0x400, 0x200, 00400, 00200, 00100,
                        00040, 00020, 00010, 00004, 00002, 00001};
    char* setmode = "sgbrwxrwxrwx";

    printf("mode: ");
    for (int i = 0; i < (int)sizeof(mode); i++) {
        if ((file.st_mode & setnum[i]) != 0) {
            mode[i] = setmode[i];
            printf("%c", mode[i]);
        }
        else
            printf("%c", mode[i]);
    }
    puts("");

    free(path);

    return 0;
}                                    

좋은 웹페이지 즐겨찾기