如何在多个操作系统下获取c中的文件修改时间?

时间:2012-02-18 16:16:02

标签: c file datetime portability

我正在尝试用c编写一个便携式函数来比较2个文件的最后修改时间。文件很小,一个接一个地写,所以我需要比1秒(毫秒)更精细的粒度 似乎有太多的时间/日期函数......

3 个答案:

答案 0 :(得分:3)

您应该查看stat()函数。它位于*nixwindows上。

他们都会返回一个包含字段名称st_msize的结构。它们是我听过的最好的功能,以便从操作系统获取此类信息。

由于您需要可移植性,请注意处理Windows上可用的各种不同类型。在* NIX上,它是一个经典的time_t结构。如果您包含特定呼叫,则可以获得纳秒秒数:根据手册页,它在POSIX.1-2008中定义。

您还可以查看how you can deal with 64/32 bit time_t

答案 1 :(得分:3)

C标准没有任何功能,但Posix规范确实如此。 2008版甚至提供亚秒级时间戳。 #define _POSIX_C_SOURCE 200809L

以下代码应该让您了解如何使用它。

#define _POSIX_C_SOURCE 200809L
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include <stdio.h> // for printf
#include <stdlib.h> // for EXIT_FAILURE

int main(int argc, char **argv)
{
    for (int i = 1; i < argc; ++i) {
        struct stat st = {0};
        int ret = lstat(argv[i], &st);
        if (ret == -1) {
            perror("lstat");
            return EXIT_FAILURE;
        }

        printf("%s: mtime sec=%lld nsec=%lld\n", argv[i],
               (long long) st.st_mtim.tv_sec, 
               (long long) st.st_mtim.tv_nsec);
    }

    return 0;
}

答案 2 :(得分:1)

对于POSIX UNIX,stat()是可移植的,并提供struct stat st_mtime,这是在纪元秒中的修改时间。 Windows stat返回窗口时间值,并且具有创建时间而不是st_ctime。 对于非POSIX UNIX实现,Windows和其他操作系统,没有文件修改时间的可移植概念。因此,根据您对便携式设备的想法,这整个概念可能或不适合您。