Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多操作系统下获得c语言中的文件修改时间?_C_File_Datetime_Portability - Fatal编程技术网

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

如何在多操作系统下获得c语言中的文件修改时间?,c,file,datetime,portability,C,File,Datetime,Portability,我正在尝试用c编写一个可移植函数,比较两个文件的最后修改时间。文件很小,一个接一个地写入,因此我需要比1秒(毫秒)更精细的粒度。 似乎有太多的时间/日期函数…您应该查看stat()函数。它可以随时使用 它们都将返回一个包含字段名stmsize的结构。为了从操作系统中获取此类信息,它们是我听说过的最好的函数 由于您需要可移植性,请注意Windows上提供的各种不同类型。在*尼克斯,这是一个经典的时间结构。如果您包括特定的调用,您可以获得纳秒mtime:根据手册页,它是在POSIX.1-2008中定

我正在尝试用c编写一个可移植函数,比较两个文件的最后修改时间。文件很小,一个接一个地写入,因此我需要比1秒(毫秒)更精细的粒度。

似乎有太多的时间/日期函数…

您应该查看
stat()
函数。它可以随时使用

它们都将返回一个包含字段名stmsize的结构。为了从操作系统中获取此类信息,它们是我听说过的最好的函数

由于您需要可移植性,请注意Windows上提供的各种不同类型。在*尼克斯,这是一个经典的时间结构。如果您包括特定的调用,您可以获得纳秒mtime:根据手册页,它是在POSIX.1-2008中定义的

您还可以查看

对于POSIX UNIX,
stat()
是可移植的,并提供了
struct stat st_mtime
,它是以秒为单位的修改时间。Windows stat返回Windows时间值,并具有创建时间,而不是
st\u ctime

对于非POSIX UNIX实现、Windows和其他操作系统,没有可移植的文件修改时间概念。因此,取决于您对便携性的想法,整个概念可能适用于您,也可能不适用于您。

C标准没有任何用于此的功能,但Posix规范有。2008版甚至提供了亚秒级的时间戳#定义_POSIX_C_源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;
}
#定义POSIX_C_SOURCE200809L
#包括
#包括
#包括
#包括//用于printf
#包括//用于退出故障
int main(int argc,字符**argv)
{
对于(int i=1;i
修改时间不是可移植的C概念。