본문 바로가기
프로그래밍/기타

[Linux, C++] 파일 소유자, 파일 크기, 접근/수정 시간 등 파일 정보 보는 방법

by GhostWeb 2021. 5. 15.
반응형

○ 헤더 및 함수

#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);

- 리턴 값

  0 : 성공

  -1 : 에러

On success, zero is returned.  On error, -1 is returned, and  errno  is set appropriately.

○ stat 구조체 설명

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
};

○ 예제 (Qt 환경)

- 코드

// QT
#include <QDebug>
#include <QString>

// C++
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>

struct stat fileStat;
const char* file = "/home/ubuntu/test.mp4";

if (stat(file, &fileStat) == 0)
{
    qDebug() << QString("st_size : %1 byte").arg(fileStat.st_size);

    struct tm* mtime = localtime(&fileStat.st_mtime);
    qDebug() <<  QString("st_mtime : %1-%2-%3 %4:%5:%6")
                 .arg(mtime->tm_year + 1900)
                 .arg(mtime->tm_mon + 1)
                 .arg(mtime->tm_mday)
                 .arg(mtime->tm_hour)
                 .arg(mtime->tm_min)
                 .arg(mtime->tm_sec);
}

- 실행 결과

14:46:40: Debugging starts
"st_size : 14037264 byte"
"st_mtime : 2016-10-13 12:7:16"

- 터미널에서 실제 test.mp4 파일의 정보

ubuntu@ubuntu-VirtualBox:~$ stat test.mp4 
  File: test.mp4
  Size: 14037264  	Blocks: 27424      IO Block: 4096   regular file
Device: 805h/2053d	Inode: 3936144     Links: 1
Access: (0666/-rw-rw-rw-)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2021-05-15 14:46:55.335863274 +0900
Modify: 2016-10-13 12:07:16.000000000 +0900
Change: 2021-05-15 14:41:57.686069600 +0900
 Birth: -
반응형