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

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

 更新時間:2016年12月22日 14:15:52   作者:zyl_lyr1019  
這篇文章主要介紹了詳解nodejs 文本操作模塊-fs模塊(一),本篇文章詳細(xì)的介紹了文件及目錄的讀寫操作,有興趣的可以了解一下。

JS的安全性問題,就決定了JS想要取操作數(shù)據(jù)庫操作文件是不可實現(xiàn)的,而Nodejs作為服務(wù)端的JS,如果依然不能操作文件,那么又如何稱之為服務(wù)端語言呢,所以在Nodejs中,提供了一個fs(File System)模塊,以實現(xiàn)文件及目錄的讀寫操作。

寫在前面

Nodejs的一大優(yōu)勢就在于,支持異步調(diào)用,不管是在讀取數(shù)據(jù)庫,還是在讀取文件時,都可以使用異步的方式進行處理,這樣就可以處理高并發(fā)的情況,從本篇開始,開始對Nodejs的fs模塊中,一些重要的API,結(jié)合源碼,進行一些說明學(xué)習(xí)。

fs模塊支持的屬性和方法

fs模塊是一個很重要的模塊,也支持非常多的屬性和方法,可以直接在nodejs中查看,fs模塊支持的屬性,創(chuàng)建一個app.js文件,輸入以下代碼,運行即可。

var fs = require("fs"), 
 i; 
  
for(i in fs){ 
 console.log(i); 
} 

由于fs的家族子弟太多,這里就不一一列舉了,下面就開始介紹一下fs家族的核心子弟。

1:open和openSync方法

對于文件操作,最基本的莫過于打開文件,你想要讀寫文件,那么就必須要打開文件才能讀寫,就像你要往冰箱放東西或者從冰箱拿東西,那么你首先要打開冰箱才行。

所以,這里就以文件的打開為首個屬性,來進入文件模塊。

文件操作中,分為同步操作和異步操作,它們的命名規(guī)則都是相同的,比如這里,open方法是異步方法,同步的方法是在異步方法的基礎(chǔ)上,添加一個”Sync“的后綴,也就是這里的openSync,還有讀取文件時也是,readFile和readFileSync等,這個在后面不再多說,并且它們的使用基本上也是相同的,唯一的差距在于異步的數(shù)據(jù)是以第二個參數(shù)的形式傳入回調(diào)函數(shù),而同步的方法,返回值就是處理的結(jié)果數(shù)據(jù)。

下面,就會以open和openSync為基礎(chǔ),把這些都說明一下。

open和openSync的使用方法:

var fs = require("fs"); 
 
fs.open(filename,flags,[mode],callback); 
 
//同步打開文件 
var fs = openSync(filename,flags,[mode]); 

以open方法的使用方式為例,open方法中,可以使用4個參數(shù),其中filename參數(shù),flags參數(shù),callback參數(shù)是必須指定的參數(shù),mode參數(shù)為可選參數(shù)。

其中:

filename是你所要讀取文件的路徑,可以是絕對路徑,也可以是相對路徑,這個就看你喜好了。

callback為打開文件成功后,執(zhí)行的回調(diào)函數(shù),回調(diào)函數(shù)的格式為:

function(err , data){ 
//err為讀取文件失敗時,觸發(fā)的錯誤對象 
//data為回調(diào)函數(shù)的可用數(shù)據(jù)。 
//在open的回調(diào)函數(shù)中,data是一個整數(shù)值,代表打開文件時返回的文件描述符(文件句柄)。 
//每一個文件,都有唯一的文件描述符(句柄)。 
} 

基本上,在fs模塊中的所有異步執(zhí)行函數(shù)的回調(diào)函數(shù),都是這樣的格式,唯一的差距就是在于回調(diào)函數(shù)的第二個數(shù)據(jù),也就是操作成功后,得到的數(shù)據(jù)的差別,在以后的內(nèi)容中,對該部分,就不再多說。

mode為可選參數(shù),用于指定當(dāng)文件被打開時,對該文件的讀寫權(quán)限,默認(rèn)值為0666(可讀寫),該方法使用4個數(shù)字組成mode屬性值,它們的組成方式符合以下規(guī)則:

第一個數(shù)字必須是0,表示該數(shù)據(jù)是一個八進制的數(shù)字。

第二個數(shù)字,用于規(guī)定文件或者目錄所有者的權(quán)限。

第三個數(shù)字,用于規(guī)定文件或者目錄所有者所屬用戶組的權(quán)限。

第四個數(shù)字,規(guī)定其他人的權(quán)限。

對于上述的第二,第三,第四個數(shù)字,讀寫權(quán)限的設(shè)置符合以下規(guī)則。

設(shè)置為1:表示為執(zhí)行權(quán)限。

設(shè)置為2:表示有寫權(quán)限。

設(shè)置為4:表示有毒權(quán)限。

如果需要設(shè)置有執(zhí)行權(quán)限和寫權(quán)限,則數(shù)字設(shè)置為3,如果只想要有讀寫權(quán)限,則設(shè)置為6,即,你想要哪些權(quán)限,你就把上述代表權(quán)限的數(shù)字相加即可。如果設(shè)置,需要執(zhí)行權(quán)限,讀寫權(quán)限,則可以設(shè)置為7,默認(rèn)狀態(tài)為設(shè)置為6,即擁有讀寫權(quán)限。
open方法支持的另外一個參數(shù)flags,表示該對象,可以對文件執(zhí)行哪些操作,支持的屬性過多,所以放到一個列表中了:

屬性 意義
r 以【只讀】的方式打開文件. 當(dāng)文件不存在時產(chǎn)生異常
r+ 以【讀寫】的方式打開文件. 當(dāng)文件不存在時產(chǎn)生異常
rs 同步模式下,以【只讀】的方式打開文件. 指令繞過操作系統(tǒng)的本地文件系統(tǒng)緩存。該功能主要用于打開 NFS 掛載的文件, 因為它可以讓你跳過默認(rèn)使用的過時本地緩存. 但這實際上非常影響 I/O 操作的性能, 因此除非你確實有這樣的需求, 否則請不要使用該標(biāo)志。注意: 這并不意味著 fs.open() 變成了一個同步阻塞的請求. 如果你想要一個同步阻塞的請求你應(yīng)該使用 fs.openSync()。
rs 同步模式下,以【只讀】的方式打開文件. 指令繞過操作系統(tǒng)的本地文件系統(tǒng)緩存。該功能主要用于打開 NFS 掛載的文件, 因為它可以讓你跳過默認(rèn)使用的過時本地緩存. 但這實際上非常影響 I/O 操作的性能, 因此除非你確實有這樣的需求, 否則請不要使用該標(biāo)志。注意: 這并不意味著 fs.open() 變成了一個同步阻塞的請求. 如果你想要一個同步阻塞的請求你應(yīng)該使用 fs.openSync()。
rs+ 同步模式下, 以【讀寫】的方式打開文件. 請謹(jǐn)慎使用該方式, 詳細(xì)請查看 ‘rs' 的注釋.
w 以【只寫】的形式打開文件. 文件會被創(chuàng)建 (如果文件不存在) 或者覆蓋 (如果存在).
wx 作用與”w”類似,區(qū)別是如果文件存在則操作會失?。ū仨毴?chuàng)建一個新的文件才行)
w+ 以【讀寫】的方式打開文件. 文件會被創(chuàng)建 (如果文件不存在) 或者覆蓋 (如果存在).
wx+ 作用與”w+”類似,區(qū)別是如果文件存在則操作會失?。ū仨毴?chuàng)建一個新的文件才行)
a 以【附加】的形式打開文件,即新寫入的數(shù)據(jù)會附加在原來的文件內(nèi)容之后. 如果文件不存在則會默認(rèn)創(chuàng)建.
ax 作用與”a”類似,區(qū)別是如果文件存在則操作會失?。ū仨毴?chuàng)建一個新的文件才行)
a+ 以【讀取】和【附加】的形式打開文件. 如果文件不存在則會默認(rèn)創(chuàng)建.
ax+ 作用與”a+”類型,區(qū)別是如果文件存在則操作會失?。ū仨毴?chuàng)建一個新的文件才行

關(guān)于open的官方說明,請參考:fs.open()

到這里為止,使用open方法時的一些屬性,就說完了,接下來看下如何使用的,這里只給一個最簡單的例子,因為open只是單純的打開文件,并不會執(zhí)行其他的操作,當(dāng)然如果”w/w+“模式的話,會把文件清空。但是,open的功能,也只是最單純的打開文件而已,所以這里只給一個最簡單的例子,至于其他的一些復(fù)雜的操作,在后面,會慢慢涉及到的。

var fs = require("fs"), 
 i; 
  
fs.open("fs.txt","r+",function(err,fd){ 
 console.log(err); 
 console.log(fd); 
 //open一個文件成之后,返回的是一個文件的描述符,是一個數(shù)字 
}); 

這里就不在添加openSync的示例了,當(dāng)然,這里也可以按照自己的意愿修改第二個參數(shù)(flags)和第三個參數(shù)(mode)的值,不過,對于open,修改這些并沒有任何意義,只對打開文件之后的操作,有影響,所以這里不再添加示例。

看下源碼中,關(guān)于open方法的實現(xiàn):

var binding = process.binding('fs'), 
 FSReqWrap = binding.FSReqWrap; 
//binding是C++與nodejs的接口, 
//FSReqWrap是C++實現(xiàn)的一個方法。具體完成什么功能,不知 
  
function modeNum(m, def) { 
 //驗證mode所用的,把m轉(zhuǎn)換成數(shù)字 
 //如果是數(shù)字,則直接返回, 
 //如果是字符串,則轉(zhuǎn)換成8禁止數(shù)字, 
 //如果第二個參數(shù)存在,則把第二個參數(shù)轉(zhuǎn)換為數(shù)字, 
 //如果不存在,則返回undefined 
 if (util.isNumber(m)) 
 return m; 
 if (util.isString(m)) 
 return parseInt(m, 8); 
 if (def) 
 return modeNum(def); 
 return undefined; 
} 
 
function makeCallback(cb) { 
 
 if (util.isNullOrUndefined(cb)) { 
 //如果傳入的值為null或者undefined,則返回異常處理函數(shù) 
 return rethrow(); 
 //rethrow是一個異常處理函數(shù),這里不涉及 
 } 
 
 if (!util.isFunction(cb)) { 
 //如果傳入的值,不是function類型,則拋出一個類型錯誤 
 throw new TypeError('callback must be a function'); 
 } 
 
 //否則,形成一個閉包,用于改變回調(diào)函數(shù)的內(nèi)部指向 
 //當(dāng)該誒不上下文時,則內(nèi)部的this指向頂級作用域 
 return function() { 
 return cb.apply(null, arguments); 
 }; 
} 
 
function nullCheck(path, callback) { 
 //判斷path是否合法,就是不能再path中,包含空格符。 
 if (('' + path).indexOf('\u0000') !== -1) { 
 var er = new Error('Path must be a string without null bytes.'); 
 if (!callback) 
  throw er; 
 //如果不合法,則傳入err,并執(zhí)行回調(diào)函數(shù) 
 process.nextTick(function() { 
  callback(er); 
 }); 
 return false; 
 } 
 return true; 
} 
  
fs.open = function(path, flags, mode, callback) { 
 //使用傳入的最后一個參數(shù),生成一個有閉包的函數(shù),作為回調(diào)函數(shù) 
 callback = makeCallback(arguments[arguments.length - 1]); 
 mode = modeNum(mode, 438 /*=0666*/); 
 //設(shè)置mode為八進制的數(shù)值,如果沒有設(shè)置,則默認(rèn)設(shè)置為438,八進制=0666 
 
 //如果path路徑不合法,則直接執(zhí)行回調(diào),并把錯誤對象傳入回調(diào)函數(shù), 
 //結(jié)束 
 if (!nullCheck(path, callback)) return; 
 
 //否則,實例化一個FSReqWrap對象,并給該對象綁定一個oncomplete方法。 
 var req = new FSReqWrap(); 
 req.oncomplete = callback; 
 
 //使用C++公開的接口,執(zhí)行打開文件的操作。 
 binding.open(pathModule._makeLong(path), 
    stringToFlags(flags), 
    mode, 
    req); 
}; 

以上源碼中的binding,包含了一些直接調(diào)用C++程序的接口,這里不涉及該部分,如果想要了解,請查看:Nodejs如何與C++對接的。

2:close和closeSync方法

前面說了open方法,可以打開文件,那么就必然有方法來關(guān)閉文件,所以這里看看fs模塊中模塊的關(guān)閉。

使用方法:

var fs = require("fs"); 
 
fs.open("fs.txt","r",function(err,fd){ 
 //有一點需要注意,close文件時,需要文件描述符,也就是open成功時,返回的數(shù)字。 
 //即,需要fd。 
  
 fs.close(fd,function(err){ 
  //close的回調(diào)函數(shù),該回調(diào)只支持一個參數(shù),就是當(dāng)發(fā)生錯誤時的錯誤對象 
 }); 
 //關(guān)于close的同步執(zhí)行方法closeSync,這里就不舉例了 
}); 

象征性的看下,close源碼中的處理:

fs.close = function(fd, callback) { 
 var req = new FSReqWrap(); 
 req.oncomplete = makeCallback(callback); 
 //創(chuàng)建一個實例,并把回調(diào)函數(shù),綁定到實例中的oncomplete屬性上 
 
 //調(diào)用C++中的close方法。 
 binding.close(fd, req); 
}; 

篇幅有限,本篇就到此為止。

總結(jié)

本篇雖然只說了這最基本的四種方法,但是也是把fs模塊中一些基本的方法,都包含了,比如flag屬性,比如mode屬性,比如回調(diào)方法的參數(shù),比如異步和同步的命名規(guī)范等,所以這一篇文章也是屬于很重要的一篇。

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

相關(guān)文章

  • Node 模塊原理與用法詳解

    Node 模塊原理與用法詳解

    這篇文章主要介紹了Node 模塊原理與用法,結(jié)合實例形式詳細(xì)分析了node.js模塊基本概念、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-05-05
  • express+multer上傳圖片打開亂碼問題及解決

    express+multer上傳圖片打開亂碼問題及解決

    這篇文章主要介紹了express+multer上傳圖片打開亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Node.js之readline模塊的使用詳解

    Node.js之readline模塊的使用詳解

    這篇文章主要介紹了Node.js之readline模塊的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 利用Node.js了解與測量HTTP所花費的時間詳解

    利用Node.js了解與測量HTTP所花費的時間詳解

    這篇文章主要給大家介紹了關(guān)于利用Node.js了解與測量HTTP所花費的時間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 詳解nodejs微信jssdk后端接口

    詳解nodejs微信jssdk后端接口

    本篇文章主要介紹了詳解nodejs微信jssdk后端接口,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • node.js實現(xiàn)逐行讀取文件內(nèi)容的代碼

    node.js實現(xiàn)逐行讀取文件內(nèi)容的代碼

    這篇文章主要介紹了node.js實現(xiàn)逐行讀取文件內(nèi)容的代碼,本文還介紹了一個node.js的按行讀取內(nèi)容開源項目,需要的朋友可以參考下
    2014-06-06
  • Nest.js系列學(xué)習(xí)之初識nest項目框架及服務(wù)

    Nest.js系列學(xué)習(xí)之初識nest項目框架及服務(wù)

    這篇文章主要為大家介紹了Nest.js系列學(xué)習(xí)之初識nest項目框架及服務(wù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Nest.js環(huán)境變量配置與序列化詳解

    Nest.js環(huán)境變量配置與序列化詳解

    這篇文章主要給大家介紹了關(guān)于Nest.js環(huán)境變量配置與序列化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 參考EventEmitter實現(xiàn)完整訂閱發(fā)布功能函數(shù)

    參考EventEmitter實現(xiàn)完整訂閱發(fā)布功能函數(shù)

    這篇文章主要為大家介紹了參考EventEmitter實現(xiàn)完整訂閱發(fā)布功能函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • NodeJs生成sitemap站點地圖的方法示例

    NodeJs生成sitemap站點地圖的方法示例

    這篇文章主要介紹了NodeJs生成sitemap站點地圖的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評論