Получить время последнего изменения файла в 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, ... чтобы устранить риск использования неправильного размера буфера.

Я сначала заподозрил, что ваша файловая система просто не поддерживает отслеживание времени последнего изменения, но поскольку вы говорите, что другие инструменты могут его показать, я подозреваю, что код ломается по какой-либо причине.

может быть, имена файлов не являются полными именами путей, т. е. они не включают правильный префикс каталога?