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

方法集合
方法集合,不是说的State对象中包含的方法集合,而是说,在调用哪些API时,返回的值时一个State的实例,比如,在fstate就是其中之一。
其他方法集合包括:
当然,这里还包括同步的方法,同步的方法,这里就不在执行说明了,对于这三种方法的不同之处在于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实例中的属性和方法,就这些了,对于现状纯理论学习的我来说,这些属性和方法,大多数都是用不到的,不过,做个了解还是有必要的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# node
# fs模块
# nodejs
# 文本操作模块
# 如何在Nodejs中使用模块fs文件系统
# 详解nodejs 文本操作模块-fs模块(五)
# 详解nodejs 文本操作模块-fs模块(三)
# 详解nodejs 文本操作模块-fs模块(一)
# 详解nodejs 文本操作模块-fs模块(二)
# 学习Nodejs之fs模块的使用详解
# 操作系统
# 都是
# 回调
# 只在
# 是一个
# 不太
# 返回值
# 象中
# 是说
# 自己的
# 我就
# 也不
# 是在
# 都有
# 会有
# 是因为
# 我在
# 看了
# 第一个
# 是有
相关文章:
如何通过可视化优化提升建站效果?
建站之星如何开启自定义404页面避免用户流失?
建站主机是否属于云主机类型?
如何配置FTP站点权限与安全设置?
建站之星代理如何获取技术支持?
建站之星云端配置指南:模板选择与SEO优化一键生成
如何快速打造个性化非模板自助建站?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何通过虚拟主机快速完成网站搭建?
建站之星安装路径如何正确选择及配置?
如何在景安服务器上快速搭建个人网站?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何选择可靠的免备案建站服务器?
如何登录建站主机?访问步骤全解析
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
如何用好域名打造高点击率的自主建站?
c# 在ASP.NET Core中管理和取消后台任务
如何在云虚拟主机上快速搭建个人网站?
在线教育网站制作平台,山西立德教育官网?
如何用AWS免费套餐快速搭建高效网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
英语简历制作免费网站推荐,如何将简历翻译成英文?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
测试制作网站有哪些,测试性取向的权威测试或者网站?
建站之星如何一键生成手机站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
设计网站制作公司有哪些,制作网页教程?
香港服务器租用费用高吗?如何避免常见误区?
网页设计与网站制作内容,怎样注册网站?
制作宣传网站的软件,小红书可以宣传网站吗?
网站制作网站,深圳做网站哪家比较好?
建站与域名管理如何高效结合?
如何有效防御Web建站篡改攻击?
如何快速重置建站主机并恢复默认配置?
常州自助建站工具推荐:低成本搭建与模板选择技巧
网站制作难吗安全吗,做一个网站需要多久时间?
如何选择PHP开源工具快速搭建网站?
建站主机如何安装配置?新手必看操作指南
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
,如何利用word制作宣传手册?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
微信小程序 input输入框控件详解及实例(多种示例)
建站之星后台管理系统如何操作?
*请认真填写需求信息,我们会在24小时内与您取得联系。