首页 > 语言 > JavaScript > 正文

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

2024-05-06 15:04:23
字体:
来源:转载
供稿:网友

在前文中,提到了一个概念,就是当我在读取文件时,我需要知道这个文件的数据量的大小,而在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); };             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选