파일 속성 조회

Juni and ING·2020년 8월 21일
0

파일 속성 구조체

 struct stat {
    dev_t     st_dev;         /* ID of device containing file */
    ino_t     st_ino;         /* Inode number */
    mode_t    st_mode;        /* File type and mode */
    nlink_t   st_nlink;       /* Number of hard links */
    uid_t     st_uid;         /* User ID of owner */
    gid_t     st_gid;         /* Group ID of owner */
    dev_t     st_rdev;        /* Device ID (if special file) */
    off_t     st_size;        /* Total size, in bytes */
    blksize_t st_blksize;     /* Block size for filesystem I/O */
    blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

    /* Since Linux 2.6, the kernel supports nanosecond
    precision for the following timestamp fields.
    For the details before Linux 2.6, see NOTES. */

    struct timespec st_atim;  /* Time of last access */
    struct timespec st_mtim;  /* Time of last modification */
    struct timespec st_ctim;  /* Time of last status change */

    #define st_atime st_atim.tv_sec      /* Backward compatibility */
    #define st_mtime st_mtim.tv_sec
    #define st_ctime st_ctim.tv_sec
};

속성 조회 함수

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);

인자

pathname : 파일 경로
fd : File descriptor
statbuf : 파일 속성을 저장할 구조체

반환값

성공 시 : 0
실패 시 : -1


매크로

Description

S_ISREG(statbuf.st_mode) //Regular file?
S_ISDIR(statbuf.st_mode) //Directory?
S_ISCHR(statbuf.st_mode) //Character device?
S_ISBLK(statbuf.st_mode) //Block device?
S_ISFIFO(statbuf.st_mode) //FIFO?
S_ISLNK(statbuf.st_mode) //Symbolic link?
S_ISSOCK(statbuf.st_mode) //Socket?

Example

static void show_file_info(const char * const file)
{
    struct stat statbuf;
    
    if(stat(file, &statbuf) < 0){
        perror("stat() FAIL\n");
        return;
    }
    
    printf("Name : %s\n", file);
    printf("Type : ");
    if(S_ISREG(statbuf.st_mode)){
        printf("Regular file");
    }
    else if(S_ISDIR(statbuf.st_mode)){
        printf("Directory");
    }
    else {
        printf("The others");
    }
    printf("\n");
    printf("Size : %ld\n", statbuf.st_size);
}
profile
인기는 없지만 그래도 임베디드를 사랑하는 한 개발자

0개의 댓글