亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解nodejs 文本操作模塊-fs模塊(四)

 更新時(shí)間:2016年12月22日 14:42:15   作者:zyl_lyr1019  
本篇文章詳細(xì)的講訴fa.fstat方法,這個(gè)State對象中,包含的數(shù)據(jù)都有哪些,并且他們分別代表的含義是什么。具有一定的參考價(jià)值,有興趣的可以了解一下。

在前文中,提到了一個(gè)概念,就是當(dāng)我在讀取文件時(shí),我需要知道這個(gè)文件的數(shù)據(jù)量的大小,而在readFile的源碼中,是使用的fa.fstat方法,獲取到了文件的相關(guān)數(shù)據(jù),而對于使用fstat獲取到的一個(gè)對象中,所包含的屬性和方法代表的具體含義,前文中并沒有涉及,本篇就看下,這個(gè)State對象中,包含的數(shù)據(jù)都有哪些,并且他們分別代表的含義是什么。

方法集合

方法集合,不是說的State對象中包含的方法集合,而是說,在調(diào)用哪些API時(shí),返回的值時(shí)一個(gè)State的實(shí)例,比如,在fstate就是其中之一。

其他方法集合包括:

  • fs.fstat 
  • fs.lstat 
  • fs.stat 

當(dāng)然,這里還包括同步的方法,同步的方法,這里就不在執(zhí)行說明了,對于這三種方法的不同之處在于fstat和stat是用于查看文件的信息的,而lstat是用于查看查看目錄信息的,并且在調(diào)用時(shí),也是有差別的

fs.stat(path,callback); 
//傳入的參數(shù)是文件路徑,和回調(diào)函數(shù) 
 
fs.lstat(path,callback); 
//傳入的參數(shù)是目錄的路徑,和回調(diào)函數(shù) 
 
fs.fstat(fd,callback); 
//傳入的參數(shù)是文件描述符,和回調(diào)函數(shù) 
//所以,該方法在readFile時(shí),在open打開文件成功之后,才使用。 
 
callback(err,stats){ 
//回調(diào)函數(shù)的參數(shù)是相同的,第一個(gè)參數(shù)為錯(cuò)誤對象,包含錯(cuò)誤信息 
//第二個(gè)參數(shù),也就是本篇文章的重點(diǎn),為一個(gè)State對象的實(shí)例,包含對應(yīng)文件的或者目錄的相關(guān)信息 
} 

State對象的源碼

這里沒有在繼續(xù)給實(shí)例,是因?yàn)椋谖铱磥?,這里只是一些屬性和方法的集合,如果需要,直接調(diào)用即可,所以沒有什么用法的差異。

先看源碼,在源碼中,注釋每一個(gè)屬性的代表含義(該部分源自“Nodejs權(quán)威指南”)。

// 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為文件或者目錄所在的設(shè)備ID,只有在UNIX操作系統(tǒng)下該值有效 
 
    this.mode = mode; 
    //和之前在write時(shí)的mode屬性相同,為文件的權(quán)限標(biāo)志,數(shù)字形式 
 
    this.nlink = nlink; 
    //文件或目錄的硬連接數(shù),類似于一個(gè)文件的別名,使用fs.link創(chuàng)建,使用fs.unlink刪除, 
    //我這里不太理解這個(gè)存在的意義,所以接下來也不會有這個(gè)相關(guān)的內(nèi)容 
 
    this.uid = uid; 
    //uid為文件或者目錄的所有者的用戶ID,僅在UNIX操作系統(tǒng)有效 
 
    this.gid = gid; 
    //gid為文件或者目錄所有者所在組的ID,僅在UNIX操作系統(tǒng)有效 
 
    this.rdev = rdev; 
    //字符設(shè)備文件或者塊設(shè)備文件所在的設(shè)備ID,僅在UNIX操作系統(tǒng)有效 
 
    this.blksize = blksize; 
    //沒有在任何地方,看到關(guān)于該屬性的描述,源碼中 
 
    this.ino = ino; 
    //文件或者目錄的索引編號,僅在UNIX操作系統(tǒng)下有效 
 
    this.size = size; 
    //文件尺寸,即文件中的字節(jié)數(shù) 
 
    this.blocks = blocks; 
    //沒有看到相關(guān)的介紹 
 
    this.atime = new Date(atim_msec); 
    //文件數(shù)據(jù)上次被訪問的時(shí)間.會被 mknod(2), utimes(2), and read(2) 等系統(tǒng)調(diào)用改變。 
 
    this.mtime = new Date(mtim_msec); 
    // 文件上次被修改的時(shí)間。 會被 mknod(2), utimes(2), and write(2) 等系統(tǒng)調(diào)用改變 
 
    this.ctime = new Date(ctim_msec); 
    //文件狀態(tài)上次改變的時(shí)間。 (inode data modification).  
    //會被 chmod(2), chown(2), link(2), mknod(2), rename(2),  
    //unlink(2), utimes(2), read(2), and write(2) 等系統(tǒng)調(diào)用改變。 
 
    this.birthtime = new Date(birthtim_msec); 
    // 文件被創(chuàng)建的時(shí)間。 會在文件被創(chuàng)建時(shí)生成。 在一些不提供文件birthtime的文件系統(tǒng)中,  
    //這個(gè)字段會被 ctime 或 1970-01-01T00:00Z (ie, unix epoch timestamp 0)來填充 
 
}; 
 
//屬于一個(gè)判斷各個(gè)屬性的方法,其他方法,都是基于調(diào)用該方法,獲取得到的返回值。 
fs.Stats.prototype._checkModeProperty = function(property) { 
  return ((this.mode & constants.S_IFMT) === property); 
}; 
 
//用于判斷被查看的對象是否為一個(gè)目錄,返回true,false 
fs.Stats.prototype.isDirectory = function() { 
  return this._checkModeProperty(constants.S_IFDIR); 
}; 
 
//用于判斷,被查看的對象是否為一個(gè)文件,返回true,false,于isDirectory的返回值相反 
fs.Stats.prototype.isFile = function() { 
  return this._checkModeProperty(constants.S_IFREG); 
}; 
 
//用于判斷被查看的文件時(shí)否為一個(gè)塊設(shè)備文件(概念請看源碼之后),返回true,false,只在UNIX操作系統(tǒng)有效 
fs.Stats.prototype.isBlockDevice = function() { 
  return this._checkModeProperty(constants.S_IFBLK); 
}; 
 
//用于判斷被查看的文件,是否為一個(gè)字符設(shè)備文件,返回true,false,只在UNIX系統(tǒng)下有效 
//本以為其值與isBlockDevice返回值相反,但是測試了一下,都是返回的false(MAC系統(tǒng),操作.js的文件), 
//可能是有些關(guān)系不,暫時(shí)不太了解 
fs.Stats.prototype.isCharacterDevice = function() { 
  return this._checkModeProperty(constants.S_IFCHR); 
}; 
 
//被查看的文件是否為一個(gè)符號鏈接文件,返回true,false,該方法只在lstat的回調(diào)函數(shù)中有效。 
//如果被查看的文件是符合鏈接文件,那么就認(rèn)為改符號鏈接是一個(gè)目錄,需要使用lstat查看相關(guān)的屬性才行。 
fs.Stats.prototype.isSymbolicLink = function() { 
  return this._checkModeProperty(constants.S_IFLNK); 
}; 
 
//查看文件是否為一個(gè)FIFO文件,返回true,false,僅在UNIX系統(tǒng)下有效 
fs.Stats.prototype.isFIFO = function() { 
  return this._checkModeProperty(constants.S_IFIFO); 
}; 
 
//判斷一個(gè)文件是否為socket文件,返回true,false,僅在UNIX系統(tǒng)下有效。 
//話說:有socket文件這種文件?socket文件也可以判斷的? 
fs.Stats.prototype.isSocket = function() { 
  return this._checkModeProperty(constants.S_IFSOCK); 
}; 

在上文中,出現(xiàn)了兩個(gè)屬性是沒有找到相關(guān)介紹的,這個(gè)時(shí)候,我就順便查看了下Nodeje的底層C++源碼,找到了一段代碼如下:

# if defined(__POSIX__) 
  X(blksize) 
# else 
  Local<Value> blksize = Undefined(env->isolate()); 
# endif 

其中__POSIX__應(yīng)該是一個(gè)POSIX的表示,表示是不是支持POSIX標(biāo)準(zhǔn)。

POSIX的百度百科:

POSIX 表示可移植操作系統(tǒng)接口(Portable Operating System Interface ,縮寫為 POSIX ),POSIX標(biāo)準(zhǔn)定義了操作系統(tǒng)應(yīng)該為應(yīng)用程序提供的接口標(biāo)準(zhǔn),是IEEE為要在各種UNIX操作系統(tǒng)上運(yùn)行的軟件而定義的一系列API標(biāo)準(zhǔn)的總稱,其正式稱呼為IEEE 1003,而國際標(biāo)準(zhǔn)名稱為ISO/IEC 9945。

這樣看來,該屬性也是在UNIX系統(tǒng)下才起作用的,但是具體指代的值,沒有找到,暫時(shí)先不管來~~(有點(diǎn)不靠譜了)。

塊設(shè)備和字符設(shè)備(來自百度百科):

I/O設(shè)備大致分為兩類:塊設(shè)備和字符設(shè)備。塊設(shè)備將信息存儲在固定大小的塊中,每個(gè)塊都有自己的地址。數(shù)據(jù)塊的大小通常在512字節(jié)到32768字節(jié)之間。塊設(shè)備的基本特征是每個(gè)塊都能獨(dú)立于其它塊而讀寫。磁盤是最常見的塊設(shè)備。

在大多數(shù)的UNIX操作系統(tǒng)中,塊設(shè)備只支持以塊為單位的訪問方式,如磁盤等.KYLIN支持以字符方式來訪問塊設(shè)備,即支持以字符為單位來讀寫磁盤等塊設(shè)備。所以在/dev目錄中的塊設(shè)備,如磁盤等,均以字符設(shè)備的外觀出現(xiàn)。所以,字符設(shè)備和塊設(shè)備的區(qū)別主要體現(xiàn)在KYLIN內(nèi)核中的管理方式,操作方式和內(nèi)核/設(shè)備驅(qū)動接口上。

總結(jié)

基本上,State實(shí)例中的屬性和方法,就這些了,對于現(xiàn)狀純理論學(xué)習(xí)的我來說,這些屬性和方法,大多數(shù)都是用不到的,不過,做個(gè)了解還是有必要的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論