How to get a path’s mtime in C++ on Linux?

Posted on In Programming, QA, Tutorial

How to get a path’s mtime in C++ on Linux? The path can be a file or a dir.

You may call the standard library function lstat() for the file or dir under the path.

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

From the returned stat struct, there is a field st_mtim which is the mtime.

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

One C++ example is as follows.

#include <sys/stat.h>
#include <cstdio>
#include <cstdlib>

#include <iostream>
#include <iomanip>

int main (int argc, char *argv[])
{
  if (argc < 2) {
    std::cerr << "Usage: " << argv[0] << " path\n";
    return 1;
  }
  std::string path(argv[1]);

  struct stat s;
  if ( lstat(path.c_str(), &s) == 0 ) {
    auto mtime = s.st_mtim;
    std::cout << path << " mtime is ";
    std::cout << mtime.tv_sec << "." << std::setw(9) << std::setfill('0') << mtime.tv_nsec << "\n";
  } else {
    //error
    std::cerr << "stat() return !0 value\n";
    return 1;
  }
  return 0;
}

Execution example:

$ ./main ./main 
./main mtime is 1596961585.201655914

Eric Ma

Eric is a systems guy. Eric is interested in building high-performance and scalable distributed systems and related technologies. The views or opinions expressed here are solely Eric's own and do not necessarily represent those of any third parties.

Leave a Reply

Your email address will not be published. Required fields are marked *