2012-05-04 50 views
8

我在一个C程序中,我需要获得文件的最后修改时间工作。程序的功能是遍历目录中的每个文件,当找到某个文件时,它会调用另一个函数来检查文件的最后修改时间。获取文件的最后修改时间在Linux

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

当程序检查每一个文件但它总是返回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所有不同的变化,但他们都返回5月3日。

感谢您提供的任何帮助。

+0

也许清理第一:为什么一个大小为20的传递给'strftime'而缓冲区是10多长时间?为什么不检查'stat'的返回值?如果'stat'失败,则解析垃圾值。 – mvds

+0

@mvds遗憾,是一个错字 – Boardy

+0

确保您通过不同的文件路径,也是“attrib.st_ctime”将给“最后状态改变的时候”,如果你正在寻找“最后修改时间”,你需要使用“ attrib.st_mtime“ – ray

回答

9

这是时区非常重要的情况之一。您获得st_mtimegmtime。你应该改用localtime即。

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

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

+1

我仍然会在你的函数中推荐更多错误检查,尽管 – Petesh

3

事情来解决:

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

我首先怀疑你的文件系统根本不支持跟踪最后一次修改时间,但因为你说其他的工具来管理表现出来,我怀疑的代码是打破无论出于何种原因。

会不会是文件名不是全路径名,即它们不包括适当的目录前缀?

9

这对我来说工作得很好:

#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)); 
} 
相关问题