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

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

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

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

方法集合

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

其他方法集合包括:

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

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

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時,在open打開文件成功之后,才使用。 
 
callback(err,stats){ 
//回調(diào)函數(shù)的參數(shù)是相同的,第一個參數(shù)為錯誤對象,包含錯誤信息 
//第二個參數(shù),也就是本篇文章的重點,為一個State對象的實例,包含對應(yīng)文件的或者目錄的相關(guān)信息 
} 

State對象的源碼

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

先看源碼,在源碼中,注釋每一個屬性的代表含義(該部分源自“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時的mode屬性相同,為文件的權(quán)限標(biāo)志,數(shù)字形式 
 
    this.nlink = nlink; 
    //文件或目錄的硬連接數(shù),類似于一個文件的別名,使用fs.link創(chuàng)建,使用fs.unlink刪除, 
    //我這里不太理解這個存在的意義,所以接下來也不會有這個相關(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ù)上次被訪問的時間.會被 mknod(2), utimes(2), and read(2) 等系統(tǒng)調(diào)用改變。 
 
    this.mtime = new Date(mtim_msec); 
    // 文件上次被修改的時間。 會被 mknod(2), utimes(2), and write(2) 等系統(tǒng)調(diào)用改變 
 
    this.ctime = new Date(ctim_msec); 
    //文件狀態(tài)上次改變的時間。 (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)建的時間。 會在文件被創(chuàng)建時生成。 在一些不提供文件birthtime的文件系統(tǒng)中,  
    //這個字段會被 ctime 或 1970-01-01T00:00Z (ie, unix epoch timestamp 0)來填充 
 
}; 
 
//屬于一個判斷各個屬性的方法,其他方法,都是基于調(diào)用該方法,獲取得到的返回值。 
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); 
}; 
 
//用于判斷被查看的文件時否為一個塊設(shè)備文件(概念請看源碼之后),返回true,false,只在UNIX操作系統(tǒng)有效 
fs.Stats.prototype.isBlockDevice = function() { 
  return this._checkModeProperty(constants.S_IFBLK); 
}; 
 
//用于判斷被查看的文件,是否為一個字符設(shè)備文件,返回true,false,只在UNIX系統(tǒng)下有效 
//本以為其值與isBlockDevice返回值相反,但是測試了一下,都是返回的false(MAC系統(tǒng),操作.js的文件), 
//可能是有些關(guān)系不,暫時不太了解 
fs.Stats.prototype.isCharacterDevice = function() { 
  return this._checkModeProperty(constants.S_IFCHR); 
}; 
 
//被查看的文件是否為一個符號鏈接文件,返回true,false,該方法只在lstat的回調(diào)函數(shù)中有效。 
//如果被查看的文件是符合鏈接文件,那么就認(rèn)為改符號鏈接是一個目錄,需要使用lstat查看相關(guān)的屬性才行。 
fs.Stats.prototype.isSymbolicLink = function() { 
  return this._checkModeProperty(constants.S_IFLNK); 
}; 
 
//查看文件是否為一個FIFO文件,返回true,false,僅在UNIX系統(tǒng)下有效 
fs.Stats.prototype.isFIFO = function() { 
  return this._checkModeProperty(constants.S_IFIFO); 
}; 
 
//判斷一個文件是否為socket文件,返回true,false,僅在UNIX系統(tǒng)下有效。 
//話說:有socket文件這種文件?socket文件也可以判斷的? 
fs.Stats.prototype.isSocket = function() { 
  return this._checkModeProperty(constants.S_IFSOCK); 
}; 

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

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

其中__POSIX__應(yīng)該是一個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)上運行的軟件而定義的一系列API標(biāo)準(zhǔn)的總稱,其正式稱呼為IEEE 1003,而國際標(biāo)準(zhǔn)名稱為ISO/IEC 9945。

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

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

I/O設(shè)備大致分為兩類:塊設(shè)備和字符設(shè)備。塊設(shè)備將信息存儲在固定大小的塊中,每個塊都有自己的地址。數(shù)據(jù)塊的大小通常在512字節(jié)到32768字節(jié)之間。塊設(shè)備的基本特征是每個塊都能獨立于其它塊而讀寫。磁盤是最常見的塊設(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實例中的屬性和方法,就這些了,對于現(xiàn)狀純理論學(xué)習(xí)的我來說,這些屬性和方法,大多數(shù)都是用不到的,不過,做個了解還是有必要的。

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

相關(guān)文章

最新評論