Get last modified time of file in linux
Solution 1
This is one of those cases where timezones matter. You're getting gmtime
of the st_mtime
. You should instead be using localtime
viz.
strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime)));
this is because ls
uses your timezone information, and when you used gmtime
as part of the display, it deliberately omitted any timezone information.
Solution 2
This worked fine for me:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
void getFileCreationTime(char *path) {
struct stat attr;
stat(path, &attr);
printf("Last modified time: %s", ctime(&attr.st_mtime));
}
Solution 3
Things to fix:
- Use the proper field, i.e.
st_ctime
. - Check that
stat()
succeeds before using its result. - Use
strftime(date, sizeof date, ...
to remove the risk of using the wrong buffer size.
I first suspected that your filesystem simply didn't support tracking the last-modified time, but since you say that other tools manage to show it, I suspect the code is breaking for whatever reason.
Could it be that the filenames are not full path names, i.e. they don't include the proper directory prefix?
Related videos on Youtube
Boardy
Develop apps and services in PHP, C#, C++, HTML, CSS, Jquery etc, recently started learning React.
Updated on July 09, 2022Comments
-
Boardy almost 2 years
I am working on a C program where I need to get the last modified time of the file. What the program does is a function loops through each file within a directory and when a particular file(s) is found it calls another function to check that the last modified times of the file.
Within the directory there is a
mylog.txt.1
,mylog.txt.2
andmylog.txt.3
etc. When I list the directory in linux using the ll command I can see thatmylog.txt.1
andmylog.txt.2
were modified on the 4th May andmylog.txt.3
was modified on the 3rd May.When the program checks each of these files however, it is always returning 3rd may. Below is the code that I am using.
void getFileCreationTime(char *filePath) { struct stat attrib; stat(filePath, &attrib); char date[10]; strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime))); printf("The file %s was last modified at %s\n", filePath, date); date[0] = 0; }
I've tried all the different variations of
st_ctime
, i.e.st_mtime
andst_atime
but they all return 3rd may.Thanks for any help you can provide.
-
mvds about 12 yearsmaybe cleanup first: why pass a size of 20 to
strftime
while the buffer is 10 long? why not check the return value ofstat
? Ifstat
fails, you're parsing a garbage value. -
ray about 12 yearsmake sure you are passing different filepath, also "attrib.st_ctime" will give the "time of last status change", if you are looking for "time of last modification" you need to use "attrib.st_mtime"
-
-
Anya Shenanigans about 12 yearsI would still recommend a lot more error checking in your function, though