亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

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

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

寫在前面

Nodejs的一大優勢就在于,支持異步調用,不管是在讀取數據庫,還是在讀取文件時,都可以使用異步的方式進行處理,這樣就可以處理高并發的情況,從本篇開始,開始對Nodejs的fs模塊中,一些重要的API,結合源碼,進行一些說明學習。

fs模塊支持的屬性和方法

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

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

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

1:open和openSync方法

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

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

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

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

open和openSync的使用方法:

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

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

其中:

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

callback為打開文件成功后,執行的回調函數,回調函數的格式為:

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

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

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

第一個數字必須是0,表示該數據是一個八進制的數字。

第二個數字,用于規定文件或者目錄所有者的權限。

第三個數字,用于規定文件或者目錄所有者所屬用戶組的權限。

第四個數字,規定其他人的權限。

對于上述的第二,第三,第四個數字,讀寫權限的設置符合以下規則。

設置為1:表示為執行權限。

設置為2:表示有寫權限。

設置為4:表示有毒權限。

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

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

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

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

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

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

看下源碼中,關于open方法的實現:

var binding = process.binding('fs'),  FSReqWrap = binding.FSReqWrap; //binding是C++與nodejs的接口, //FSReqWrap是C++實現的一個方法。具體完成什么功能,不知   function modeNum(m, def) {  //驗證mode所用的,把m轉換成數字  //如果是數字,則直接返回,  //如果是字符串,則轉換成8禁止數字,  //如果第二個參數存在,則把第二個參數轉換為數字,  //如果不存在,則返回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,則返回異常處理函數  return rethrow();  //rethrow是一個異常處理函數,這里不涉及  }   if (!util.isFunction(cb)) {  //如果傳入的值,不是function類型,則拋出一個類型錯誤  throw new TypeError('callback must be a function');  }   //否則,形成一個閉包,用于改變回調函數的內部指向  //當該誒不上下文時,則內部的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,并執行回調函數  process.nextTick(function() {   callback(er);  });  return false;  }  return true; }   fs.open = function(path, flags, mode, callback) {  //使用傳入的最后一個參數,生成一個有閉包的函數,作為回調函數  callback = makeCallback(arguments[arguments.length - 1]);  mode = modeNum(mode, 438 /*=0666*/);  //設置mode為八進制的數值,如果沒有設置,則默認設置為438,八進制=0666   //如果path路徑不合法,則直接執行回調,并把錯誤對象傳入回調函數,  //結束  if (!nullCheck(path, callback)) return;   //否則,實例化一個FSReqWrap對象,并給該對象綁定一個oncomplete方法。  var req = new FSReqWrap();  req.oncomplete = callback;   //使用C++公開的接口,執行打開文件的操作。  binding.open(pathModule._makeLong(path),     stringToFlags(flags),     mode,     req); }; 

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

2:close和closeSync方法

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

使用方法:

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

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

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

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

總結

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人激情视频免费在线| 亚洲精品网址在线观看| 亚洲片在线资源| 国产精选久久久久久| 亚洲国产成人精品久久久国产成人一区| 深夜成人在线观看| 精品在线小视频| 91精品国产综合久久久久久蜜臀| 色婷婷久久一区二区| www.欧美三级电影.com| 一区二区三区久久精品| 亚洲男人的天堂网站| 91免费电影网站| 国语自产精品视频在免费| 91免费高清视频| 伊人久久精品视频| 亚洲精品女av网站| 日韩电影免费观看在线| 欧美成人sm免费视频| 色综合久久88色综合天天看泰| 欧美黄网免费在线观看| 欧美日韩亚洲精品一区二区三区| 91九色视频在线| 日本精品视频在线观看| 欧美国产日韩在线| 91精品国产自产在线老师啪| 91在线视频成人| 久久久久久久影视| 久久精品国产亚洲精品2020| 亚洲国模精品私拍| 国产精品电影久久久久电影网| 久久精品中文字幕免费mv| 国产欧美欧洲在线观看| 国产91在线播放精品91| 亚洲天堂视频在线观看| 欧美极品少妇全裸体| 欧美激情视频免费观看| 高清亚洲成在人网站天堂| 欧美色播在线播放| 久久久久久97| 最近2019中文免费高清视频观看www99| 国产视频久久久久| 欧美成人免费网| 亚洲3p在线观看| 日韩视频免费大全中文字幕| 久久久成人精品| 日本午夜精品理论片a级appf发布| 欧美日韩在线视频一区| 亚洲一区二区三区成人在线视频精品| 97精品一区二区视频在线观看| 91在线观看免费高清完整版在线观看| 在线看日韩av| 中文字幕在线日韩| 国产精品久久久久久久久久久久久| 国产亚洲欧洲高清一区| 日韩a**站在线观看| 欧美大尺度电影在线观看| 亚洲国产精品va在线看黑人动漫| 亚洲福利精品在线| 久久久亚洲影院你懂的| 51久久精品夜色国产麻豆| 国产日产久久高清欧美一区| 国产日产亚洲精品| 亚洲精品不卡在线| 欧美中文字幕在线视频| 国产精品91在线| 日本久久久久久久| 大桥未久av一区二区三区| 欧美日韩国产第一页| 亚洲一区av在线播放| 亚洲第一男人天堂| 色噜噜狠狠狠综合曰曰曰88av| 欧美成人午夜激情在线| 日韩毛片在线看| 久久精品国产一区二区电影| 日本精品一区二区三区在线播放视频| 久久久久亚洲精品成人网小说| 欧美性生交大片免网| 国产一区二区三区在线播放免费观看| 久久免费视频这里只有精品| 欧美国产中文字幕| 色噜噜狠狠色综合网图区| 色偷偷综合社区| 亚洲视频网站在线观看| 国产日韩精品电影| 亚洲va久久久噜噜噜久久天堂| 午夜精品久久久久久久男人的天堂| 欧美日韩国产二区| 国产精品海角社区在线观看| 91在线直播亚洲| 国产精品自产拍在线观| 国产精品99久久久久久久久久久久| 国产午夜精品免费一区二区三区| 国产成人一区二区三区电影| 久久精品视频导航| 久久夜精品va视频免费观看| 中文字幕在线亚洲| 亚州国产精品久久久| 国产精品美女久久久久久免费| 亚洲综合社区网| 激情久久av一区av二区av三区| 中文字幕精品www乱入免费视频| 国产精品久久久久7777婷婷| 深夜福利亚洲导航| 97国产精品免费视频| 91久久久久久| 精品偷拍一区二区三区在线看| 91系列在线播放| 欧美精品在线看| 久久夜精品香蕉| 中文字幕在线成人| 456国产精品| 97在线日本国产| 亚洲aaaaaa| 97国产精品人人爽人人做| 日韩av最新在线观看| 精品久久久免费| 精品国产乱码久久久久久虫虫漫画| 国产亚洲精品美女| 奇米一区二区三区四区久久| 国产一区二区三区18| 亚洲精品日韩av| 日本亚洲精品在线观看| 久久久91精品国产| 亚洲欧美国产一区二区三区| 精品国产鲁一鲁一区二区张丽| 亚洲国产成人精品女人久久久| 国产精品美女网站| 亚洲视频999| 欧美精品18videos性欧美| 午夜精品久久久久久久久久久久久| 91精品国产成人www| 97在线精品视频| 亚洲成人久久电影| 亚洲www永久成人夜色| 欧美日韩综合视频| 欧美性猛交xxxx乱大交蜜桃| 日韩国产欧美精品一区二区三区| 国产成人精品视频在线| 欧美精品在线极品| 国产99视频精品免视看7| 久久久久久国产精品| 国产精品夜间视频香蕉| 日韩av综合网| 亚洲精品一区中文字幕乱码| 亚洲男人第一av网站| 欧美国产日韩精品| 98午夜经典影视| 97国产suv精品一区二区62| 日韩女优人人人人射在线视频| 日韩av有码在线| 欧美午夜精品伦理| 精品一区二区三区四区| 欧美亚洲激情视频| 国产精品极品尤物在线观看| 中文字幕亚洲专区| 久久精品国产亚洲精品2020| 日韩国产中文字幕| 欧美疯狂做受xxxx高潮| 国产精品99久久99久久久二8| 欧美成人在线影院| 欧美性猛交xxxx免费看漫画| 日韩电影大片中文字幕| 亚洲男人天堂视频|