How to get a path’s mtime in C++ on Linux?
Posted on In Programming, QA, TutorialHow 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