详解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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
14款NodeJS Web框架推荐
Jul 11 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 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中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
js以对象为索引的关联数组
2010/07/04 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
python批量提取word内信息
2015/08/09 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
python3.x实现发送邮件功能
2018/05/22 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
介绍一下代理模式(Proxy)
2014/10/17 面试题
关键字throw与throws的用法差异
2016/11/22 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
财务副总经理工作职责
2013/11/25 职场文书
体育运动会广播稿
2014/10/05 职场文书
初中军训感言
2015/08/01 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL