17

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

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

然而,当程序检查每个文件时,它总是返回 3rd may。下面是我正在使用的代码。

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但它们都在 3 日返回。st_mtimest_atime

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

4

3 回答 3

22

这对我来说很好:

#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));
}
于 2012-05-04T10:12:36.027 回答
16

这是时区很重要的情况之一。你得到gmtimest_mtime. 您应该改为使用localtime即。

strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime)));

这是因为ls使用了你的时区信息,当你用作gmtime显示的一部分时,它故意省略了任何时区信息。

于 2012-05-04T10:01:21.403 回答
4

要解决的问题:

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

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

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

于 2012-05-04T10:01:16.680 回答