Получить время последнего изменения файла в Linux
Я работаю над программой на C, где мне нужно получить последнее измененное время файла. То, что делает программа, - это функция, проходящая через каждый файл в каталоге, и когда определенный файл(ы) найден, он вызывает другую функцию, чтобы проверить, что последнее измененное время файла.
в каталоге есть mylog.txt.1
, mylog.txt.2
и mylog.txt.3
etc. Когда я перечисляю каталог в linux с помощью команды ll, я вижу, что mylog.txt.1
и mylog.txt.2
были изменены на 4 Май и mylog.txt.3
был изменен 3 мая.
когда программа проверяет каждый из этих файлов, однако, он всегда возвращается 3 мая. Ниже приведен код, который я использую.
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 %sn", filePath, date);
date[0] = 0;
}
я пробовал все различные варианты st_ctime
, то есть st_mtime
и st_atime
но все они возвращаются 3 мая.
Спасибо за любую помощь вы можете предоставить.
3 ответов
это один из тех случаев, когда часовые пояса имеет значения. Вы получаете gmtime
на st_mtime
. Вместо этого вы должны использовать localtime
виз.
strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime)));
это так ls
использует информацию о часовом поясе, и когда вы использовали gmtime
в качестве части дисплея он намеренно опустил любую информацию о часовом поясе.
это отлично сработало для меня:
#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));
}
- чего исправить:
- используйте правильное поле, т. е.
st_ctime
. - проверяем, что
stat()
успешно перед использованием его результата. - использовать
strftime(date, sizeof date, ...
чтобы устранить риск использования неправильного размера буфера.
Я сначала заподозрил, что ваша файловая система просто не поддерживает отслеживание времени последнего изменения, но поскольку вы говорите, что другие инструменты могут его показать, я подозреваю, что код ломается по какой-либо причине.
может быть, имена файлов не являются полными именами путей, т. е. они не включают правильный префикс каталога?