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

Posted

技术标签:

【中文标题】获取linux中文件的最后修改时间【英文标题】:Get last modified time of file in linux 【发布时间】:2012-05-13 20:41:30 【问题描述】:

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

目录中有mylog.txt.1mylog.txt.2mylog.txt.3等。当我在linux中使用ll命令列出目录时,我可以看到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 的所有不同变体,即st_mtimest_atime,但它们都在5 月3 日返回。

感谢您提供的任何帮助。

【问题讨论】:

也许首先清理:为什么在缓冲区长度为 10 时将 20 的大小传递给 strftime?为什么不检查stat 的返回值呢?如果stat 失败,您正在解析一个垃圾值。 确保你传递不同的文件路径,“attrib.st_ctime”也会给出“最后一次状态变化的时间”,如果你正在寻找“最后一次修改的时间”,你需要使用“attrib .st_mtime" 【参考方案1】:

这对我来说很好用:

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

【讨论】:

【参考方案2】:

这是时区很重要的情况之一。您将获得st_mtime 中的gmtime。您应该改用 localtime 即。

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

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

【讨论】:

我仍然建议在您的函数中进行更多错误检查【参考方案3】:

要解决的问题:

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

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

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

【讨论】:

以上是关于获取linux中文件的最后修改时间的主要内容,如果未能解决你的问题,请参考以下文章

Linux下用shell获取指定文件的最后修改时间并与系统时间比对,如果相差时间超过3分钟则执行另一个脚本

linux如何得到一个文件的最后修改时间

如何在文件系统中获取最后修改的日期和时间?

如何在java中获取目录的最后修改日期和时间

Linux下,如何将最后修改时间在某个时间之前的文件删除掉?

获取git目录中文件的最后修改日期