詳解nodejs 文本操作模塊-fs模塊(四)
在前文中,提到了一個(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)文章
node.js+npm的環(huán)境配置以及添加鏡像(保姆級教程)
本文主要介紹了node.js+npm的環(huán)境配置以及添加鏡像,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02Bun入門學(xué)習(xí)教程吊打Node或Deno的現(xiàn)代JS運(yùn)行時(shí)
這篇文章主要為大家介紹了一款吊打Node或Deno的現(xiàn)代JS運(yùn)行時(shí),Bun入門學(xué)習(xí)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07基于Alpine Linux構(gòu)建前端node-web鏡像步驟詳解
這篇文章主要為大家介紹了基于Alpine Linux構(gòu)建前端node-web鏡像步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11在?node?中使用?koa-multer?庫上傳文件的方式詳解
本文主要介紹了上傳單個(gè)文件、多個(gè)文件,文件數(shù)量大小限制、限制文件上傳類型和對上傳的圖片進(jìn)行不同大小的裁剪,對node使用?koa-multer?庫上傳文件相關(guān)知識感興趣的朋友一起看看吧2024-01-01配置node服務(wù)器并且鏈接微信公眾號接口配置步驟詳解
這篇文章主要介紹了配置node服務(wù)器并且鏈接微信公眾號接口配置步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06Node.js + Redis Sorted Set實(shí)現(xiàn)任務(wù)隊(duì)列
本文給大家分享的是使用Node.js + Redis Sorted Set實(shí)現(xiàn)任務(wù)隊(duì)列的方法示例,非常的實(shí)用,有需要的小伙伴可以參考下2016-09-09Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置指南(簡單易操作)
在實(shí)際開發(fā)過程中我們可能需要安裝多個(gè)版本的 nodejs,下面這篇文章主要給大家介紹了關(guān)于Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Windows部署NVM并下載多版本Node.js的方法(含刪除原有Node的方法)
這篇文章主要介紹了Windows部署NVM并下載多版本Node.js的方法(含刪除原有Node的方法),文中通過圖文結(jié)合的方式講解的非常詳細(xì),對大家了解Node.js有一定的幫助,需要的朋友可以參考下2025-01-01