詳解nodejs 文本操作模塊-fs模塊(四)
在前文中,提到了一個(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)文章
node.js+npm的環(huán)境配置以及添加鏡像(保姆級(jí)教程)
本文主要介紹了node.js+npm的環(huán)境配置以及添加鏡像,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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?庫(kù)上傳文件的方式詳解
本文主要介紹了上傳單個(gè)文件、多個(gè)文件,文件數(shù)量大小限制、限制文件上傳類型和對(duì)上傳的圖片進(jìn)行不同大小的裁剪,對(duì)node使用?koa-multer?庫(kù)上傳文件相關(guān)知識(shí)感興趣的朋友一起看看吧2024-01-01配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解
這篇文章主要介紹了配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(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)配置指南(簡(jiǎn)單易操作)
在實(shí)際開發(fā)過(guò)程中我們可能需要安裝多個(gè)版本的 nodejs,下面這篇文章主要給大家介紹了關(guān)于Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Windows部署NVM并下載多版本Node.js的方法(含刪除原有Node的方法)
這篇文章主要介紹了Windows部署NVM并下載多版本Node.js的方法(含刪除原有Node的方法),文中通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家了解Node.js有一定的幫助,需要的朋友可以參考下2025-01-01