欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

方法集合

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

其他方法集合包括:

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

當(dāng)然,這里還包括同步的方法,同步的方法,這里就不在執(zhí)行說(shuō)明了,對(duì)于這三種方法的不同之處在于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ò)誤對(duì)象,包含錯(cuò)誤信息 
//第二個(gè)參數(shù),也就是本篇文章的重點(diǎn),為一個(gè)State對(duì)象的實(shí)例,包含對(duì)應(yīng)文件的或者目錄的相關(guān)信息 
} 

State對(duì)象的源碼

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

先看源碼,在源碼中,注釋每一個(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è)存在的意義,所以接下來(lái)也不會(huì)有這個(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; 
    //沒(méi)有在任何地方,看到關(guān)于該屬性的描述,源碼中 
 
    this.ino = ino; 
    //文件或者目錄的索引編號(hào),僅在UNIX操作系統(tǒng)下有效 
 
    this.size = size; 
    //文件尺寸,即文件中的字節(jié)數(shù) 
 
    this.blocks = blocks; 
    //沒(méi)有看到相關(guān)的介紹 
 
    this.atime = new Date(atim_msec); 
    //文件數(shù)據(jù)上次被訪問(wèn)的時(shí)間.會(huì)被 mknod(2), utimes(2), and read(2) 等系統(tǒng)調(diào)用改變。 
 
    this.mtime = new Date(mtim_msec); 
    // 文件上次被修改的時(shí)間。 會(huì)被 mknod(2), utimes(2), and write(2) 等系統(tǒng)調(diào)用改變 
 
    this.ctime = new Date(ctim_msec); 
    //文件狀態(tài)上次改變的時(shí)間。 (inode data modification).  
    //會(huì)被 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í)間。 會(huì)在文件被創(chuàng)建時(shí)生成。 在一些不提供文件birthtime的文件系統(tǒng)中,  
    //這個(gè)字段會(huì)被 ctime 或 1970-01-01T00:00Z (ie, unix epoch timestamp 0)來(lái)填充 
 
}; 
 
//屬于一個(gè)判斷各個(gè)屬性的方法,其他方法,都是基于調(diào)用該方法,獲取得到的返回值。 
fs.Stats.prototype._checkModeProperty = function(property) { 
  return ((this.mode & constants.S_IFMT) === property); 
}; 
 
//用于判斷被查看的對(duì)象是否為一個(gè)目錄,返回true,false 
fs.Stats.prototype.isDirectory = function() { 
  return this._checkModeProperty(constants.S_IFDIR); 
}; 
 
//用于判斷,被查看的對(duì)象是否為一個(gè)文件,返回true,false,于isDirectory的返回值相反 
fs.Stats.prototype.isFile = function() { 
  return this._checkModeProperty(constants.S_IFREG); 
}; 
 
//用于判斷被查看的文件時(shí)否為一個(gè)塊設(shè)備文件(概念請(qǐng)看源碼之后),返回true,false,只在UNIX操作系統(tǒng)有效 
fs.Stats.prototype.isBlockDevice = function() { 
  return this._checkModeProperty(constants.S_IFBLK); 
}; 
 
//用于判斷被查看的文件,是否為一個(gè)字符設(shè)備文件,返回true,false,只在UNIX系統(tǒng)下有效 
//本以為其值與isBlockDevice返回值相反,但是測(cè)試了一下,都是返回的false(MAC系統(tǒng),操作.js的文件), 
//可能是有些關(guān)系不,暫時(shí)不太了解 
fs.Stats.prototype.isCharacterDevice = function() { 
  return this._checkModeProperty(constants.S_IFCHR); 
}; 
 
//被查看的文件是否為一個(gè)符號(hào)鏈接文件,返回true,false,該方法只在lstat的回調(diào)函數(shù)中有效。 
//如果被查看的文件是符合鏈接文件,那么就認(rèn)為改符號(hào)鏈接是一個(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)下有效。 
//話說(shuō):有socket文件這種文件?socket文件也可以判斷的? 
fs.Stats.prototype.isSocket = function() { 
  return this._checkModeProperty(constants.S_IFSOCK); 
}; 

在上文中,出現(xiàn)了兩個(gè)屬性是沒(méi)有找到相關(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,而國(guó)際標(biāo)準(zhǔn)名稱為ISO/IEC 9945。

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

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

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

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

總結(jié)

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

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

相關(guān)文章

最新評(píng)論