【问题标题】:Setting file access time, modification time设置文件访问时间、修改时间
【发布时间】:2020-11-17 17:52:38
【问题描述】:

我有一个挂载驱动器中的文件列表。我正在尝试设置访问和修改时间。

这是使用utime修改前的stat信息

Access: 2020-07-28 15:06:51.000000000 +0530
Modify: 2020-07-28 15:06:51.000000000 +0530

这里是使用utime后的stat信息。

Access: 2020-07-28 21:20:47.-469639744
Modify: 2020-07-28 21:20:47.-469740064

这里是代码

#include <stdio.h>
#include <utime.h>
#include <time.h>
#include <string.h>
#include <errno.h>

int main(void) {
    const char *filepath = "pathToFile/file";
    struct utimbuf ubuf;
    ubuf.actime = time(NULL) + (time_t)(6*60*60);
    ubuf.modtime = time(NULL) + (time_t)(6*60*60);
    errno = 0;
    int ret = utime(filepath, &ubuf);
    if (ret == -1) {
        printf("Error is: %s\n", strerror(errno));
    } else {
        puts("No Error!");
    }
    return 0;
}

这里如何保留+0530的时区信息?

【问题讨论】:

  • 没有时区信息。只是stat 就是这样显示的。 stat 显示未来日期的时区会很奇怪。
  • 请选择一种语言并坚持下去。 C 和 C++ 是两种非常不同的语言,对于任何给定的问题可能有不同的解决方案。而且您的代码是 POSIX 特定的,因此您应该添加 posix 标记。
  • 另请注意,POSIX 将utime 标记为已过时,您不应在新代码中使用它。
  • 错误属于标准错误。 fprintf(stderr, "Error ...
  • @Someprogrammerdude 不知道通过显示这个例子的 IBM 网站,推荐的方式是什么?

标签: c time posix


【解决方案1】:

文件时间戳中没有存储时区信息(至少在我使用的文件系统中没有)。只是stat 是这样显示的。

来自stat.c human_time()的相关代码:

  if (localtime_rz (tz, &t.tv_sec, &tm))
    nstrftime (str, sizeof str, "%Y-%m-%d %H:%M:%S.%N %z", &tm, tz, ns);
  else
    {
      char secbuf[INT_BUFSIZE_BOUND (intmax_t)];
      sprintf (str, "%s.%09d", timetostr (t.tv_sec, secbuf), ns);
    }

在内部,所有统计信息“知道”是struct timespec 格式的文件的时间戳,没有任何时区信息。如果在localtime_rz() 调用中从文件时间戳到struct tm 的秒转换成功,则时间戳以包含%z 时区信息的格式打印。如果调用失败,则使用"%s.%09d"。时间戳不会被存储,它是在stat 显示有关文件的信息时从戳中推断(“猜测”)的。

【讨论】:

  • 谢谢,其实我现在可以看到时间戳了。这是一个 samba 共享,它需要一分钟来更改和显示时区。这正常吗?
  • @AAB 缓存问题可能吗?
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多