node.js中fs.stat里的atime,mtime,ctime,birthtime在debian下的更新规则与区别


发布者 kris  发布时间 1495611274665
关键字 JS学习  Node.JS 
在node.js中可以通过fs.stats命令,可以查看文件的属性,状态,修改时间等:

var fs = require('fs');
fs.stat(filePath, function(err, states) {
  console.log(states)
})
Stats {
  dev: 2114,
  ino: 48064969,
  mode: 33188,
  nlink: 1,
  uid: 85,
  gid: 100,
  rdev: 0,
  size: 527,
  blksize: 4096,
  blocks: 8,
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT }

其中:
atime是指access time,即文件被读取或者执行的时间,修改文件是不会改变access time的。网上很多资料都声称cat、more等读取文件的命令会改变atime,这其实与系统设置有关的,一般默认不会修改。
ctime即change time文件状态改变时间,指文件的i结点被修改的时间
mtime即modify time,指文件内容被修改的时间。
birthtime即文件创建时间,很多文件系统不支持。

在不同的操作系统和设置下,atime/ctime/mtime的更新规则是不一样的,比如我们在Linux Debian下实测的例子:

Debian不支持Birth文件创建时间


使用touch创建,并使用stat查看文件状态

root@VM-104-49-debian:/var/www# touch test.log
root@VM-104-49-debian:/var/www# stat test.log
  File: ‘test.log’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fe01h/65025d    Inode: 405946      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-24 14:48:15.376000000 +0800
Modify: 2017-05-24 14:48:15.376000000 +0800
Change: 2017-05-24 14:48:15.376000000 +0800
 Birth: -

可以看到Birth是空的。因此在Debin等Linux下面通过 states.birthtime 来判断文件创建时间会有各样的BUG,
比如通过 fs.utimes修改atime和mtime时,在debian下birthtime也会更改。并且有时 birthtime会比mtime更新。

查看文件不会改变Access time


出于性能考虑使用cat查看文件内容,不会修改atime,在Windows下也是同时,不过可以通过系统配置启用atime访问时间的自动更新

root@VM-104-49-debian:/var/www# cat test.log
root@VM-104-49-debian:/var/www# stat test.log
  File: ‘test.log’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fe01h/65025d    Inode: 405946      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-24 14:48:15.376000000 +0800
Modify: 2017-05-24 14:48:15.376000000 +0800
Change: 2017-05-24 14:48:15.376000000 +0800
 Birth: -

修改文件内容Modify、Change时间会一同修改


无论是使用重写还是添加,(mtime,ctime)会一同改变
root@VM-104-49-debian:/var/www# echo 'abc' > test.log
root@VM-104-49-debian:/var/www# stat test.log
  File: ‘test.log’
  Size: 4               Blocks: 8          IO Block: 4096   regular file
Device: fe01h/65025d    Inode: 405946      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-24 14:48:15.376000000 +0800
Modify: 2017-05-24 14:49:38.372000000 +0800
Change: 2017-05-24 14:49:38.372000000 +0800
 Birth: -
root@VM-104-49-debian:/var/www# echo 'abc' >> test.log
root@VM-104-49-debian:/var/www# stat test.log
  File: ‘test.log’
  Size: 8               Blocks: 8          IO Block: 4096   regular file
Device: fe01h/65025d    Inode: 405946      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-24 14:48:15.376000000 +0800
Modify: 2017-05-24 14:49:46.324000000 +0800
Change: 2017-05-24 14:49:46.324000000 +0800
 Birth: -

更改文件属性只会改变Change时间


通过chown更新文件所属用户,只有ctime发生改变。

root@VM-104-49-debian:/var/www# chown newghost test.log
root@VM-104-49-debian:/var/www# stat test.log
  File: ‘test.log’
  Size: 8               Blocks: 8          IO Block: 4096   regular file
Device: fe01h/65025d    Inode: 405946      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/newghost)   Gid: (    0/    root)
Access: 2017-05-24 14:48:15.376000000 +0800
Modify: 2017-05-24 14:49:46.324000000 +0800
Change: 2017-05-24 14:51:14.792000000 +0800


因此可以看出states的atime是非常类似于创建时间的,而且一般也不会被更改。所以在服务器上可代替创建时间使用。









 热门文章 - 分享最多
  1. JavaScript使用ES6的Class面向对象继承时 this is not defined 解决方法
  2. Docker改名Moby:急于商业化陷入品牌更名乱象
  3. Java已快过时?斯坦福大学将JavaScript作为计算机科学入门课
  4. TCP/UDP协议比较:在Node.JS中UDP服务器和客户端通信示例
  5. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法
  6. "永恒之蓝"比特币勒索病毒(WannaCry)的攻击原理
  7. 周鸿祎:一些程序员没有商业意识,却又很自负,一看就知道不会创业
  8. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  9. Node.JS用Socket实现FTP Server服务器和Client客户端
  10. Node.JS更改Windows注册表regedit的几种方法

 相关阅读
  1. decodeURIComponent有个BUG,当浏览器请求地址含%+数字时,会解析错误
  2. NodeJS的DNS使用:域名解析,MX记录查询,SPF反垃圾邮件测试
  3. Node.JS如何调用Chrome打开浏览器链接地址
  4. 用纯Node.JS弹出Windows系统消息提示框(MessageBox)
  5. 利用Windows注册表将你的Node.JS程序添加到右健菜单直接运行
  6. JavaScript中splice与slice的区别、数组的复制以及在指定位置添加删除元素
  7. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  8. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  9. JavaScrip字符串模板表达式中的反引号怎么打?
  10. Node.JS用Socket实现FTP Server服务器和Client客户端

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA