在linux中获取文件的最后修改时间

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

在目录中有一个mylog.txt.1mylog.txt.2mylog.txt.3等等。当我使用ll命令列出linux中的目录时,我可以看到mylog.txt.1mylog.txt.2 5月4日修改了2个,5月3日修改了mylog.txt.3

然而,当程序检查这些文件时,它总是在5月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_ctime所有不同的变体,即st_mtimest_atime但它们都返回3月5日。

感谢您的任何帮助,您可以提供。

Solutions Collecting From Web of "在linux中获取文件的最后修改时间"

这是时区很重要的情况之一。 你正在获取st_mtime gmtime 。 你应该改为使用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, ...来消除使用错误缓冲区大小的风险。

我首先怀疑你的文件系统根本不支持跟踪最后修改的时间,但是由于你说其他工具能够显示它,所以我怀疑代码是因为什么原因而中断的。

难道是文件名不是完整的路径名,即他们不包括正确的目录前缀?