在前文中,提到了一個概念,就是當我在讀取文件時,我需要知道這個文件的數據量的大小,而在readFile的源碼中,是使用的fa.fstat方法,獲取到了文件的相關數據,而對于使用fstat獲取到的一個對象中,所包含的屬性和方法代表的具體含義,前文中并沒有涉及,本篇就看下,這個State對象中,包含的數據都有哪些,并且他們分別代表的含義是什么。
方法集合
方法集合,不是說的State對象中包含的方法集合,而是說,在調用哪些API時,返回的值時一個State的實例,比如,在fstate就是其中之一。
其他方法集合包括:
當然,這里還包括同步的方法,同步的方法,這里就不在執行說明了,對于這三種方法的不同之處在于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實例中的屬性和方法,就這些了,對于現狀純理論學習的我來說,這些屬性和方法,大多數都是用不到的,不過,做個了解還是有必要的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答