在linux中获取文件的上次修改时间

时间:2012-05-04 09:50:30

标签: c linux timestamp last-modified

我正在开发一个C程序,我需要获取文件的最后修改时间。程序的作用是循环遍历目录中的每个文件,当找到特定文件时,它调用另一个函数来检查文件的最后修改时间。

在目录中有mylog.txt.1mylog.txt.2mylog.txt.3等。当我使用ll命令在linux中列出目录时,我可以看到mylog.txt.1和{ {1}}已于5月4日进行了修改,并在5月3日修改了mylog.txt.2

当程序检查这些文件时,它总是返回第3个。下面是我正在使用的代码。

mylog.txt.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 %s\n", filePath, date); date[0] = 0; } 的所有不同版本,即st_ctimest_mtime,但它们都会返回第3版。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:16)

这对我来说很好:

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

答案 1 :(得分:11)

这是时区重要的案例之一。您收到gmtime的{​​{1}}。您应该使用st_mtime

localtime

这是因为strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime))); 使用您的时区信息,当您使用ls作为显示的一部分时,它故意省略任何时区信息。

答案 2 :(得分:3)

要解决的问题:

  • 使用正确的字段,即st_ctime
  • 在使用结果之前检查stat()是否成功。
  • 使用strftime(date, sizeof date, ...消除使用错误缓冲区大小的风险。

我首先怀疑你的文件系统根本不支持跟踪上次修改的时间,但是因为你说其他工具设法显示它,我怀疑代码因任何原因而破坏。

可能是文件名不是完整路径名,即它们不包含正确的目录前缀吗?