成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Node文件系統(tǒng)fs模塊】

MyFaith / 2931人閱讀

摘要:一個(gè)例子測(cè)試返回值當(dāng)緩存區(qū)寫滿時(shí),輸出一個(gè)例子當(dāng)緩存區(qū)數(shù)據(jù)全部輸出時(shí),觸發(fā)事件系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。數(shù)據(jù)可讀文件讀取完成系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是文件系統(tǒng)模塊同步更新

環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10

1、fs 模塊API

nodejs的文件操作大部分API都提供了同步和異步的兩種方式,下面是異步API結(jié)構(gòu)圖,同步方法在異步方法后面加【Sync】就行了

1.1 API結(jié)構(gòu)圖

1.2 文件讀寫模式對(duì)應(yīng)編碼

2、一些例子

下面是部分API的例子,對(duì)部分API的一個(gè)簡(jiǎn)單代碼實(shí)現(xiàn)

2.1 readFile讀取文件
//readFile(filename,[options],callback);

/**
 * filename, 必選參數(shù),文件名
 * [options],可選參數(shù),可指定flag(文件操作選項(xiàng),如r+ 讀寫;w+ 讀寫,文件不存在則創(chuàng)建)及encoding屬性
 * callback 讀取文件后的回調(diào)函數(shù),參數(shù)默認(rèn)第一個(gè)err,第二個(gè)data 數(shù)據(jù)
 */

const fs = require("fs");
fs.readFile("./package.json",{flag:"r+",encoding:"utf8"},(err,data)=>{
    if(err)
        throw err;
    console.log(data);
})
2.2 writeFile寫文件
// fs.writeFile(filename,data,[options],callback);
/**
 * filename, 必選參數(shù),文件名
 * data, 寫入的數(shù)據(jù),可以字符或一個(gè)Buffer對(duì)象
 * [options],flag,mode(權(quán)限),encoding
 * callback 讀取文件后的回調(diào)函數(shù),參數(shù)默認(rèn)第一個(gè)err,第二個(gè)data 數(shù)據(jù)
 */

const fs = require("fs");
const data="hello world";
const bf=Buffer.from(data);
//buffer寫入
fs.writeFile("./test.txt",bf,err=>{
    if(err)
        throw err;
    console.log("寫入成功");
})

//字符寫入
fs.writeFile("./test.txt",data,err=>{
    if(err)
        throw err;
    console.log("寫入成功");
})
2.3 以追加方式寫文件
// fs.appendFile(filename,data,[options],callback);
const fs = require("fs");
const data = " hello world";
const bf = Buffer.from(data);
//buffer
fs.appendFile("./test.txt", bf, err => {
    if (err)
        throw err;
    console.log("追加成功");
})

fs.appendFile("./test.txt", data, err => {
    if (err)
        throw err;
    console.log("追加成功");
})
2.4 open打開文件

打開文件,獲取文件描述

// fs.open(filename, flags, [mode], callback);

/**
 * filename, 必選參數(shù),文件名
 * flags, 操作標(biāo)識(shí),如"r",讀方式打開
 * [mode],權(quán)限,如777,表示任何用戶讀寫可執(zhí)行
 * callback 打開文件后回調(diào)函數(shù),參數(shù)默認(rèn)第一個(gè)err,第二個(gè)fd為一個(gè)整數(shù),表示打開文件返回的文件描述符,window中又稱文件句柄
 */

const fs = require("fs");
fs.open("./test.txt","r",0666,(err,fd)=>{
    if(err)
        throw err;
    console.log(fd);    //3
})

【0666】為【文件權(quán)限碼】,也可以在【fs.constants】中輸出

2.5 讀文件,讀取打開的文件內(nèi)容到緩沖區(qū)中
//fs.read(fd, buffer, offset, length, position, callback);
/**
 * fd, 使用fs.open打開成功后返回的文件描述符
 * buffer, 一個(gè)Buffer對(duì)象,v8引擎分配的一段內(nèi)存
 * offset, 整數(shù),向緩存區(qū)中寫入時(shí)的初始位置,以字節(jié)為單位
 * length, 整數(shù),讀取文件的長(zhǎng)度
 * position, 整數(shù),讀取文件初始位置;文件大小以字節(jié)為單位
 * callback(err, bytesRead, buffer), 讀取執(zhí)行完成后回調(diào)函數(shù),bytesRead實(shí)際讀取字節(jié)數(shù),被讀取的緩存區(qū)對(duì)象
 */
const fs = require("fs");
fs.open("./test.txt", "r", (err, fd) => {
    if (err)
        throw err;
    let bf = Buffer.alloc(255);
    fs.read(fd,bf,0,9,0,(err,bytesRead,buffer)=>{
        if(err)
            throw err;
        console.log(bytesRead);
        console.log(buffer.toString());
    })
})
2.6 寫文件,將緩沖區(qū)內(nèi)數(shù)據(jù)寫入使用fs.open打開的文件
//fs.write(fd, buffer, offset, length, position, callback);

/**
 * fd, 使用fs.open打開成功后返回的文件描述符
 * buffer, 一個(gè)Buffer對(duì)象,v8引擎分配的一段內(nèi)存
 * offset, 整數(shù),從緩存區(qū)中讀取時(shí)的初始位置,以字節(jié)為單位
 * length, 整數(shù),從緩存區(qū)中讀取數(shù)據(jù)的字節(jié)數(shù)
 * position, 整數(shù),寫入文件初始位置;
 * callback(err, written, buffer), 寫入操作執(zhí)行完成后回調(diào)函數(shù),written實(shí)際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對(duì)象
 */
const fs = require("fs");
fs.open("./test.txt", "w", (err, fd) => {
    if (err)
        throw err;
    let bf = Buffer.from(" 寫入文件數(shù)據(jù)的內(nèi)容");
    fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => {
        if (err)
            throw err;
        console.log(bytesWritten);
        console.log(`寫入的內(nèi)容:${buffer.toString()}`);
    })
})
2.7 刷新緩存區(qū)

使用fs.write寫入文件時(shí),操作系統(tǒng)是將數(shù)據(jù)讀到內(nèi)存,再把數(shù)據(jù)寫入到文件中,當(dāng)數(shù)據(jù)讀完時(shí)并不代表數(shù)據(jù)已經(jīng)寫完,因?yàn)橛幸徊糠诌€可能在內(nèi)在緩沖區(qū)內(nèi)。
因此可以使用fs.fsync方法將內(nèi)存中數(shù)據(jù)寫入文件;--刷新內(nèi)存緩沖區(qū);

//fs.fsync(fd, [callback])
/**
 * fd, 使用fs.open打開成功后返回的文件描述符
 * [callback(err, written, buffer)], 寫入操作執(zhí)行完成后回調(diào)函數(shù),written實(shí)際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對(duì)象
 */

const fs = require("fs");
fs.open("./test.txt", "a+", (err, fd) => {
    if (err)
        throw err;
    let bf = Buffer.from(" I love Node");
    fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => {
        if (err)
            throw err;
       fs.fsync(fd,(err)=>{});
       fs.close(fd,err=>{});
    })
})
2.8 讀取目錄
//使用fs.readdir讀取目錄,重點(diǎn)其回調(diào)函數(shù)中files對(duì)象
//fs.readdir(path, callback);

/**
 * path, 要讀取目錄的完整路徑及目錄名;
 * [callback(err, files)], 讀完目錄回調(diào)函數(shù);err錯(cuò)誤對(duì)象,files數(shù)組,存放讀取到的目錄中的所有文件名
 */
const fs = require("fs"),
    path = require("path");
fs.readdir(__dirname + "/../11文件系統(tǒng)fs", (err, files) => {
    if (err)
        throw err;
    files.forEach(file => {
        let filePath = path.normalize(__dirname + "/" + file);
        fs.stat(filePath, (err, stats) => {
            if (stats.isFile()) {
                console.log(filePath + " is: " + "file");
            }
            if (stats.isDirectory()) {
                console.log(filePath + " is: " + "dir");
            }
        })
    })
})
3、流操作 3.1 創(chuàng)建讀取流
//fs.createReadStream(path, [options])
/**
 * path 文件路徑
 * [options] flags:指定文件操作,默認(rèn)"r",讀操作;encoding,指定讀取流編碼;autoClose, 是否讀取完成后自動(dòng)關(guān)閉,默認(rèn)true;start指定文件開始讀取位置;end指定文件開始讀結(jié)束位置
 */
const fs = require("fs");
const rs = fs.createReadStream("./package.json", { flags: "r" });
rs.on("open", fd => console.log("開始讀取文件"));
rs.on("data", data => {
    console.log(data.toString());
})
rs.on("end", function () {
    console.log("讀取文件結(jié)束")
});
rs.on("close", function () {
    console.log("文件關(guān)閉");
});
rs.on("error", function (err) {
    console.error(err);
});  
3.2 創(chuàng)建寫入流
//fs.createWriteStream(path, [options])
/**
 * path 文件路徑
 * [options] flags:指定文件操作,默認(rèn)"w",;encoding,指定讀取流編碼;start指定寫入文件的位置
 */

/* ws.write(chunk, [encoding], [callback]);
 * chunk,  可以為Buffer對(duì)象或一個(gè)字符串,要寫入的數(shù)據(jù)
 * [encoding],  編碼
 * [callback],  寫入后回調(diào)
 */

/* ws.end([chunk], [encoding], [callback]);
 * [chunk],  要寫入的數(shù)據(jù)
 * [encoding],  編碼
 * [callback],  寫入后回調(diào)
 */
const fs = require("fs");
const ws=fs.createWriteStream("./test.txt",{flags:"w"})
const bf=Buffer.from("I Love Node");
ws.on("open", function () {
    console.log("文件流開啟")
});
ws.on("close", function () {
    console.log("文件流關(guān)閉");
});
ws.on("error", function (err) {
    console.error(err);
});  
ws.write(bf,"utf8",(err,buffer)=>{
    console.log("寫入完成")
})
ws.end(" Bye");
3.3 使用流復(fù)制文件

流復(fù)制文件就是創(chuàng)建一個(gè)讀取流和一個(gè)寫入流,將讀取流中的流出的數(shù)據(jù)用寫入流進(jìn)行寫入

//使用流復(fù)制文件
const fs = require("fs");

const rs = fs.createReadStream("./package.json");

const ws = fs.createWriteStream("./package1.json");

rs.on("data", data => {
   ws.write(data);
})

ws.on("open", function (fd) {
    console.log("要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是: " + fd);
  });
  
rs.on("end",()=>{
    console.log("文件讀取完成");
    ws.end("完成",()=>{
        console.log("文件寫入完成");
    })
})

關(guān)于WriteStream對(duì)象的write方法返回一個(gè)布爾類型,當(dāng)緩存區(qū)中數(shù)據(jù)全部寫滿時(shí),返回false;表示緩存區(qū)已經(jīng)寫滿,并將立即輸出到目標(biāo)對(duì)象中。

一個(gè)例子測(cè)試返回值:

const fs = require("fs");

var ws = fs.createWriteStream(__dirname + "/test.txt",{flags:"w"});

for (var i = 0; i < 10000; i++) {
  var w_flag = ws.write(i.toString());
  //當(dāng)緩存區(qū)寫滿時(shí),輸出false
  console.log(w_flag);
}

一個(gè)例子當(dāng)緩存區(qū)數(shù)據(jù)全部輸出時(shí),觸發(fā)事件

const fs = require("fs");

const rs = fs.createReadStream("./ABoy.mp3");

const ws = fs.createWriteStream("./ABoy1.mp3");

rs.on("data", data => {
    let t = ws.write(data);
    if(!t){
        console.log(t);
    }
})

ws.on("drain", () => {
    console.log("系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。")
})
3.4 pipe管道用于流

上面使用一個(gè)讀取流額一個(gè)寫入流進(jìn)行了一次文件的復(fù)制,還有另外一種方式就是在寫入流和讀取流之間建立一條管道,是讀取流中的數(shù)據(jù)通過管道源源不斷的流向?qū)懭肓?,?shí)現(xiàn)文件的復(fù)制。

const fs = require("fs");

const rs = fs.createReadStream("./ABoy.mp3");

const ws = fs.createWriteStream("./ABoy1.mp3");

rs.pipe(ws);

rs.on("data", function (data) {
    console.log("數(shù)據(jù)可讀")
});

rs.on("end", function () {
    console.log("文件讀取完成");
});

ws.on("drain", () => {
    console.log("系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。")
});

ws.on("open", function (fd) {
    console.log("要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是: " + fd);
});

CSDN 【Node文件系統(tǒng)fs模塊】同步更新

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88733.html

相關(guān)文章

  • 認(rèn)識(shí)node核心模塊--從Buffer、Stream到fs

    摘要:端輸入數(shù)據(jù)到端,對(duì)就是輸入流,得到的對(duì)象就是可讀流對(duì)就是輸出端得到的對(duì)象是可寫流。在中,這四種流都是的實(shí)例,它們都有事件,可讀流具有監(jiān)聽數(shù)據(jù)到來的事件等,可寫流則具有監(jiān)聽數(shù)據(jù)已傳給低層系統(tǒng)的事件等,和都同時(shí)實(shí)現(xiàn)了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream會(huì)給剛接觸Node的前端工程師們帶來困惑,原因是前端并沒有類似概念(or 有我們也沒意識(shí)到)。然而,...

    TANKING 評(píng)論0 收藏0
  • Node.js 高級(jí)進(jìn)階之 fs 文件模塊學(xué)習(xí)

    摘要:回調(diào)函數(shù)提供兩個(gè)參數(shù)和,表示有沒有錯(cuò)誤發(fā)生,是文件內(nèi)容。文件關(guān)閉第一個(gè)參數(shù)文件時(shí)傳遞的文件描述符第二個(gè)參數(shù)回調(diào)函數(shù)回調(diào)函數(shù)有一個(gè)參數(shù)錯(cuò)誤,關(guān)閉文件后執(zhí)行。 showImg(//img.mukewang.com/5d3f890d0001836113660768.jpg); 人所缺乏的不是才干而是志向,不是成功的能力而是勤勞的意志。 —— 部爾衛(wèi) 文章同步到github博客:https:/...

    verano 評(píng)論0 收藏0
  • Node.js學(xué)習(xí)總結(jié)

    摘要:表示當(dāng)前正在執(zhí)行的腳本的文件名。默認(rèn)編碼為模式為,為回調(diào)函數(shù),回調(diào)函數(shù)只包含錯(cuò)誤信息參數(shù),在寫入失敗時(shí)返回。參數(shù)使用說明如下通過方法返回的文件描述符。 Node.js回調(diào) Node.js異步編程的直接體現(xiàn)就是回調(diào)。 阻塞代碼: const fs = require(fs); let data = fs.readFileSync(input.txt); console.log(data...

    kamushin233 評(píng)論0 收藏0
  • Node 基礎(chǔ)學(xué)習(xí)

    摘要:既然這樣,怎么理解中的單線程再捋一捋和的關(guān)系。在線程上,不會(huì)等待操作完成,繼續(xù)執(zhí)行后續(xù)的代碼。這就是單線程異步。在中除了代碼,一切都是并行的由于中主任務(wù)的執(zhí)行是以單線程的方式進(jìn)行,如果程序出錯(cuò)導(dǎo)致崩潰,就會(huì)終止整個(gè)流程。 node是什么 Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。 Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模...

    alaege 評(píng)論0 收藏0
  • Node.js 開發(fā)指南 讀書筆記

    摘要:為指定事件注冊(cè)一個(gè)監(jiān)聽器,接受一個(gè)字符串和一個(gè)回調(diào)函數(shù)。發(fā)射事件,傳遞若干可選參數(shù)到事件監(jiān)聽器的參數(shù)表。為指定事件注冊(cè)一個(gè)單次監(jiān)聽器,即監(jiān)聽器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻解除該監(jiān)聽器。 1.Node.js 簡(jiǎn)介 Node.js 其實(shí)就是借助谷歌的 V8 引擎,將桌面端的 js 帶到了服務(wù)器端,它的出現(xiàn)我將其歸結(jié)為兩點(diǎn): V8 引擎的出色; js 異步 io 與事件驅(qū)動(dòng)給服務(wù)器帶來極高...

    CocoaChina 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

MyFaith

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<