【问题标题】:How to get file created date using fs module?如何使用 fs 模块获取文件创建日期?
【发布时间】:2017-09-21 09:12:13
【问题描述】:

我有 linux 服务器,其中我有正在使用 winston 旋转创建的日志文件,所以 filename 有文件名和创建日期,所以你可以看到 data server20170414181405.log2017-04-14 创建的第一个文件,但使用fs.stats.birthtime 它给文件日期Apr-19-2017。如何在 linux 上获得准确的文件创建日期?

cron.js

fs.stat(filePath, function (err, stats) {
  if (err) return cb2(err);
   var fileInfo = { fileDate: stats.birthtime, filename: file };
    console.log(fileInfo);
});

数据

  { fileDate: Wed Apr 19 2017 00:51:56 GMT-0400 (EDT),
    filename: 'server20170414181405.log' },
  { fileDate: Wed Apr 19 2017 00:52:04 GMT-0400 (EDT),
    filename: 'server20170414212655.log' },
  { fileDate: Wed Apr 19 2017 00:52:07 GMT-0400 (EDT),
    filename: 'server20170415023845.log' },

【问题讨论】:

    标签: node.js linux fs


    【解决方案1】:

    获取真正的文件创建时间很困难。 linux 内核最近才开始支持它,所以我不知道birthtime 的值有多准确。这可能取决于您使用的 linux 版本。这篇文章有一些背景:

    https://unix.stackexchange.com/questions/304779/is-there-still-no-linux-kernel-interface-to-get-file-creation-date

    但是,您将创建时间添加到文件名中。与其使用fs.stat(),不如直接解析文件名并从中创建一个Date 对象?

    const filename = 'server20170414181405.log';
    const dateString = filename.substr(6, 4) + '-' + filename.substr(10, 2) 
        + '-' + filename.substr(12, 2) + 'T' + filename.substr(14, 2) 
        + ':' + filename.substr(16, 2) + ':' + filename.substr(18, 2);
    
    // '2017-04-14T18:14:05'    
    const createDate = new Date(dateString);
    

    对于您在文件名中使用的任何时区,您可以将 Z 添加到 UTC 的末尾或正确的时区偏移量。当然,这假设您的文件名是准确的,但如果是这样,它似乎比使用 fs.stat() 更容易、更快。

    -- 编辑--

    看起来您已经在filePath 变量中获得了文件的路径,因此您可以使用path.basename() 方法获取文件名:

    const path = require('path');
    
    const filename = path.basename(filePath);
    

    在此处查看 Node 文档:https://nodejs.org/dist/latest-v6.x/docs/api/path.html#path_path_basename_path_ext。获得文件名后,您可以使用我原始帖子中的代码来获取日期。

    【讨论】:

    • 我正在尝试了解您如何在不使用文件名变量的情况下解析日期
    • @hussain 我不确定我明白你在问什么。我已经编辑了我的帖子。请看一下,看看是否有帮助。
    • 您没有使用filename 变量来解析日期,当您执行s.substr(6,4) 时会发生什么,它将如何从文件名中获取日期?
    • @hussain 啊,好吧,现在我看到了错误!对不起,只是一个错字。我从 Node REPL 中复制了示例代码,却忘记更改变量名。我已经更正了。
    【解决方案2】:

    stat.birthtime 是服务器时区中文件创建的真实日期。可能会发生差异,因为 Winston 和您的服务器在不同的时区工作。

    如果不是对齐两个时区的情况,并且您需要某个特定时区的 stat.birthtime,您可以使用moment-timezone 日期构造函数。

    【讨论】:

    • 他使用的日期相隔 5 天。这是一个很大的时区差异! :)
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多