详解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 Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 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
香妃
2021/03/03 冲泡冲煮
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python简单商城购物车实例代码
2018/03/15 Python
python中scikit-learn机器代码实例
2018/08/05 Python
python实现石头剪刀布程序
2021/01/20 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
大学毕业感言
2014/01/10 职场文书
会计岗位描述
2014/02/22 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
中班上学期个人总结
2015/02/12 职场文书
公司行政管理制度范本
2015/08/05 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers