详解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的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
nodejs中使用monk访问mongodb
Jul 06 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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中的integer类型使用分析
2010/07/27 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
php实现生成验证码实例分享
2016/04/10 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
TypeScript入门-接口
2017/03/30 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
原生JS实现天气预报
2020/06/16 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
Python最基本的输入输出详解
2015/04/25 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
上海某公司.net方向笔试题
2014/09/14 面试题
人事行政主管岗位职责
2013/12/22 职场文书
文明村镇申报材料
2014/05/06 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
运动会宣传稿50字
2015/07/23 职场文书
八年级物理教学反思
2016/02/19 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL