详解nodejs 文本操作模块-fs模块(四)


Posted in NodeJs onDecember 22, 2016

在前文中,提到了一个概念,就是当我在读取文件时,我需要知道这个文件的数据量的大小,而在readFile的源码中,是使用的fa.fstat方法,获取到了文件的相关数据,而对于使用fstat获取到的一个对象中,所包含的属性和方法代表的具体含义,前文中并没有涉及,本篇就看下,这个State对象中,包含的数据都有哪些,并且他们分别代表的含义是什么。

方法集合

方法集合,不是说的State对象中包含的方法集合,而是说,在调用哪些API时,返回的值时一个State的实例,比如,在fstate就是其中之一。

其他方法集合包括:

  • fs.fstat 
  • fs.lstat 
  • fs.stat 

当然,这里还包括同步的方法,同步的方法,这里就不在执行说明了,对于这三种方法的不同之处在于fstat和stat是用于查看文件的信息的,而lstat是用于查看查看目录信息的,并且在调用时,也是有差别的

fs.stat(path,callback); 
//传入的参数是文件路径,和回调函数 
 
fs.lstat(path,callback); 
//传入的参数是目录的路径,和回调函数 
 
fs.fstat(fd,callback); 
//传入的参数是文件描述符,和回调函数 
//所以,该方法在readFile时,在open打开文件成功之后,才使用。 
 
callback(err,stats){ 
//回调函数的参数是相同的,第一个参数为错误对象,包含错误信息 
//第二个参数,也就是本篇文章的重点,为一个State对象的实例,包含对应文件的或者目录的相关信息 
}

State对象的源码

这里没有在继续给实例,是因为,在我看来,这里只是一些属性和方法的集合,如果需要,直接调用即可,所以没有什么用法的差异。

先看源码,在源码中,注释每一个属性的代表含义(该部分源自“Nodejs权威指南”)。

// Static method to set the stats properties on a Stats object. 
fs.Stats = function( 
  dev, 
  mode, 
  nlink, 
  uid, 
  gid, 
  rdev, 
  blksize, 
  ino, 
  size, 
  blocks, 
  atim_msec, 
  mtim_msec, 
  ctim_msec, 
  birthtim_msec) { 
    this.dev = dev; 
    //dev为文件或者目录所在的设备ID,只有在UNIX操作系统下该值有效 
 
    this.mode = mode; 
    //和之前在write时的mode属性相同,为文件的权限标志,数字形式 
 
    this.nlink = nlink; 
    //文件或目录的硬连接数,类似于一个文件的别名,使用fs.link创建,使用fs.unlink删除, 
    //我这里不太理解这个存在的意义,所以接下来也不会有这个相关的内容 
 
    this.uid = uid; 
    //uid为文件或者目录的所有者的用户ID,仅在UNIX操作系统有效 
 
    this.gid = gid; 
    //gid为文件或者目录所有者所在组的ID,仅在UNIX操作系统有效 
 
    this.rdev = rdev; 
    //字符设备文件或者块设备文件所在的设备ID,仅在UNIX操作系统有效 
 
    this.blksize = blksize; 
    //没有在任何地方,看到关于该属性的描述,源码中 
 
    this.ino = ino; 
    //文件或者目录的索引编号,仅在UNIX操作系统下有效 
 
    this.size = size; 
    //文件尺寸,即文件中的字节数 
 
    this.blocks = blocks; 
    //没有看到相关的介绍 
 
    this.atime = new Date(atim_msec); 
    //文件数据上次被访问的时间.会被 mknod(2), utimes(2), and read(2) 等系统调用改变。 
 
    this.mtime = new Date(mtim_msec); 
    // 文件上次被修改的时间。 会被 mknod(2), utimes(2), and write(2) 等系统调用改变 
 
    this.ctime = new Date(ctim_msec); 
    //文件状态上次改变的时间。 (inode data modification).  
    //会被 chmod(2), chown(2), link(2), mknod(2), rename(2),  
    //unlink(2), utimes(2), read(2), and write(2) 等系统调用改变。 
 
    this.birthtime = new Date(birthtim_msec); 
    // 文件被创建的时间。 会在文件被创建时生成。 在一些不提供文件birthtime的文件系统中,  
    //这个字段会被 ctime 或 1970-01-01T00:00Z (ie, unix epoch timestamp 0)来填充 
 
}; 
 
//属于一个判断各个属性的方法,其他方法,都是基于调用该方法,获取得到的返回值。 
fs.Stats.prototype._checkModeProperty = function(property) { 
  return ((this.mode & constants.S_IFMT) === property); 
}; 
 
//用于判断被查看的对象是否为一个目录,返回true,false 
fs.Stats.prototype.isDirectory = function() { 
  return this._checkModeProperty(constants.S_IFDIR); 
}; 
 
//用于判断,被查看的对象是否为一个文件,返回true,false,于isDirectory的返回值相反 
fs.Stats.prototype.isFile = function() { 
  return this._checkModeProperty(constants.S_IFREG); 
}; 
 
//用于判断被查看的文件时否为一个块设备文件(概念请看源码之后),返回true,false,只在UNIX操作系统有效 
fs.Stats.prototype.isBlockDevice = function() { 
  return this._checkModeProperty(constants.S_IFBLK); 
}; 
 
//用于判断被查看的文件,是否为一个字符设备文件,返回true,false,只在UNIX系统下有效 
//本以为其值与isBlockDevice返回值相反,但是测试了一下,都是返回的false(MAC系统,操作.js的文件), 
//可能是有些关系不,暂时不太了解 
fs.Stats.prototype.isCharacterDevice = function() { 
  return this._checkModeProperty(constants.S_IFCHR); 
}; 
 
//被查看的文件是否为一个符号链接文件,返回true,false,该方法只在lstat的回调函数中有效。 
//如果被查看的文件是符合链接文件,那么就认为改符号链接是一个目录,需要使用lstat查看相关的属性才行。 
fs.Stats.prototype.isSymbolicLink = function() { 
  return this._checkModeProperty(constants.S_IFLNK); 
}; 
 
//查看文件是否为一个FIFO文件,返回true,false,仅在UNIX系统下有效 
fs.Stats.prototype.isFIFO = function() { 
  return this._checkModeProperty(constants.S_IFIFO); 
}; 
 
//判断一个文件是否为socket文件,返回true,false,仅在UNIX系统下有效。 
//话说:有socket文件这种文件?socket文件也可以判断的? 
fs.Stats.prototype.isSocket = function() { 
  return this._checkModeProperty(constants.S_IFSOCK); 
};

在上文中,出现了两个属性是没有找到相关介绍的,这个时候,我就顺便查看了下Nodeje的底层C++源码,找到了一段代码如下:

# if defined(__POSIX__) 
  X(blksize) 
# else 
  Local<Value> blksize = Undefined(env->isolate()); 
# endif

其中__POSIX__应该是一个POSIX的表示,表示是不是支持POSIX标准。

POSIX的百度百科:

POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。

这样看来,该属性也是在UNIX系统下才起作用的,但是具体指代的值,没有找到,暂时先不管来~~(有点不靠谱了)。

块设备和字符设备(来自百度百科):

I/O设备大致分为两类:块设备和字符设备。块设备将信息存储在固定大小的块中,每个块都有自己的地址。数据块的大小通常在512字节到32768字节之间。块设备的基本特征是每个块都能独立于其它块而读写。磁盘是最常见的块设备。

在大多数的UNIX操作系统中,块设备只支持以块为单位的访问方式,如磁盘等.KYLIN支持以字符方式来访问块设备,即支持以字符为单位来读写磁盘等块设备。所以在/dev目录中的块设备,如磁盘等,均以字符设备的外观出现。所以,字符设备和块设备的区别主要体现在KYLIN内核中的管理方式,操作方式和内核/设备驱动接口上。

总结

基本上,State实例中的属性和方法,就这些了,对于现状纯理论学习的我来说,这些属性和方法,大多数都是用不到的,不过,做个了解还是有必要的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJS框架Express的模板视图机制分析
Jul 19 NodeJs
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 #NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 #NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 #NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 #NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 #NodeJs
解析NodeJs的调试方法
Dec 11 #NodeJs
You might like
让你的PHP同时支持GIF、png、JPEG
2006/10/09 PHP
解析PHP的session过期设置
2013/06/29 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
PHP7 list() 函数修改
2021/03/09 PHP
基于jquery自定义图片热区效果
2012/07/21 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
解决python写的windows服务不能启动的问题
2014/04/15 Python
Python正则表达式使用经典实例
2016/06/21 Python
解读python logging模块的使用方法
2018/04/17 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
法律专业应届本科毕业生求职信
2013/10/25 职场文书
高中军训感想800字
2014/02/23 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
党员个人整改措施
2014/10/24 职场文书
2014年实习期工作总结
2014/11/27 职场文书
离婚纠纷代理词
2015/05/23 职场文书
热爱劳动主题班会
2015/08/14 职场文书
2016年寒假见闻
2015/10/10 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
redis缓存存储Session原理机制
2021/11/20 Redis
Python测试框架pytest高阶用法全面详解
2022/06/01 Python