国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 18:19:01
字體:
來源:轉載
供稿:網友

在前文中,提到了一個概念,就是當我在讀取文件時,我需要知道這個文件的數據量的大小,而在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); }; 

在上文中,出現了兩個屬性是沒有找到相關介紹的,這個時候,我就順便查看了下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實例中的屬性和方法,就這些了,對于現狀純理論學習的我來說,這些屬性和方法,大多數都是用不到的,不過,做個了解還是有必要的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 手游| 南昌市| 武功县| 东方市| 金华市| 赤水市| 大理市| 招远市| 浮山县| 曲靖市| 宿州市| 吴堡县| 吉首市| 普宁市| 平阳县| 浮梁县| 博兴县| 中卫市| 定安县| 吴江市| 溧阳市| 乌鲁木齐县| 河津市| 曲麻莱县| 勐海县| 濉溪县| 新密市| 武川县| 平凉市| 和顺县| 通海县| 天柱县| 会理县| 明水县| 海宁市| 榕江县| 柳州市| 富源县| 杭锦后旗| 乳源| 侯马市|