文件操作
fs概述
在 NodeJS 中,所有與文件操作都是通過(guò) fs
核心模塊來(lái)實(shí)現(xiàn)的轿曙,包括文件目錄的創(chuàng)建弄捕、刪除、查詢以及文件的讀取和寫入导帝,在 fs
模塊中守谓,所有的方法都分為同步和異步兩種實(shí)現(xiàn),具有 sync
后綴的方法為同步方法您单,不具有 sync
后綴的方法為異步方法斋荞;
文件描述符fd
操作系統(tǒng)會(huì)為每個(gè)打開的文件分配一個(gè)名為文件描述符的數(shù)值標(biāo)識(shí),文件操作使用這些文件描述符來(lái)識(shí)別與追蹤每個(gè)特定的文件虐秦,Window 系統(tǒng)使用了一個(gè)不同但概念類似的機(jī)制來(lái)追蹤資源譬猫,為方便用戶讯檐,NodeJS 抽象了不同操作系統(tǒng)間的差異,為所有打開的文件分配了數(shù)值的文件描述符染服。
在 NodeJS 中别洪,每操作一個(gè)文件,文件描述符是遞增的柳刮,文件描述符一般從 3
開始挖垛,因?yàn)榍懊嬗?0
、1
秉颗、2
三個(gè)比較特殊的描述符痢毒,分別代表 process.stdin
(標(biāo)準(zhǔn)輸入)、process.stdout
(標(biāo)準(zhǔn)輸出)和 process.stderr
(錯(cuò)誤輸出)
標(biāo)識(shí)符flag
NodeJS 中蚕甥,標(biāo)識(shí)位代表著對(duì)文件的操作方式哪替,如可讀、可寫菇怀、即可讀又可寫等等凭舶,在下面來(lái)表示文件操作的標(biāo)識(shí)位和其對(duì)應(yīng)的含義
r 讀取文件,如果文件不存在則拋出異常爱沟。
r+ 讀取并寫入文件帅霜,如果文件不存在則拋出異常。
rs 讀取并寫入文件呼伸,指示操作系統(tǒng)繞開本地文件系統(tǒng)緩存身冀。
w 寫入文件碾盟,文件不存在會(huì)被創(chuàng)建缔刹,存在則清空后寫入。
wx 寫入文件响委,排它方式打開铃辖。
w+ 讀取并寫入文件剩愧,文件不存在則創(chuàng)建文件,存在則清空后寫入澳叉。
wx+ 和 w+
類似,排他方式打開沐悦。
a 追加寫入成洗,文件不存在則創(chuàng)建文件。
ax 與 a
類似藏否,排他方式打開瓶殃。
a+ 讀取并追加寫入,不存在則創(chuàng)建副签。
ax+ 與 a+
類似遥椿,排他方式打開基矮。
文件讀取
同步讀取文件readFileSync,有兩個(gè)參數(shù)
第一個(gè)參數(shù)為讀取文件的路徑或文件描述符冠场;
第二個(gè)參數(shù)為 options家浇,默認(rèn)值為 null,其中有 encoding(編碼碴裙,默認(rèn)為 null)和 flag(標(biāo)識(shí)位钢悲,默認(rèn)為 r),也可直接傳入 encoding舔株;
返回值為文件的內(nèi)容莺琳,如果沒有 encoding
,返回的文件內(nèi)容為 Buffer载慈,如果有按照傳入的編碼解析惭等。
例:
const fs = require("fs");
let resultB = fs.readFileSync("./a.txt");
let resultD = fs.readFileSync("./a.txt", "utf8");
// 當(dāng)讀取的值為Buffer的時(shí)候,可以調(diào)用其toString()的方法办铡,也可以將其轉(zhuǎn)為正常的數(shù)據(jù)格式
// console.log(resultB.toString());
console.log(resultB); // <Buffer 68 65 6c 6c 6f 20 46 53>
console.log(resultD); // Hello FS
異步讀取readFile, 有三個(gè)參數(shù)
異步讀取方法與readFileSync
的前兩個(gè)參數(shù)相同辞做,最后一個(gè)參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有兩個(gè)參數(shù) err
(錯(cuò)誤)和 data
(數(shù)據(jù))料扰,該方法沒有返回值凭豪,回調(diào)函數(shù)在讀取文件成功后執(zhí)行,第二個(gè)參數(shù)也可以不傳,通過(guò)toString()方法解析返回的數(shù)據(jù)
例:
const fs = require("fs");
fs.readFile("a.txt", "utf8", (err, data) => {
console.log(err); // null
console.log(data); // Hello FS
});
文件寫入
同步寫入writeFileSync,有三個(gè)參數(shù)
第一個(gè)參數(shù)為寫入文件的路徑或文件描述符晒杈;
第二個(gè)參數(shù)為寫入的數(shù)據(jù)嫂伞,類型為 String 或 Buffer;
第三個(gè)參數(shù)為 options
拯钻,默認(rèn)值為 null
帖努,其中有 encoding
(編碼,默認(rèn)為 utf8
)粪般、 flag
(標(biāo)識(shí)位拼余,默認(rèn)為 w
)和 mode
(權(quán)限位,默認(rèn)為 0o666
)亩歹,也可直接傳入 encoding
例:
const fs = require("fs");
fs.writeFileSync("./txt.txt", "Hello FS 你好");
let result = fs.readFileSync("./txt.txt", "utf8");
console.log(result); // Hello FS 你好
異步寫入writeFile, 有四個(gè)參數(shù)
異步寫入方法 writeFile
與 writeFileSync
的前三個(gè)參數(shù)相同匙监,最后一個(gè)參數(shù)為回調(diào)函數(shù),函數(shù)內(nèi)有一個(gè)參數(shù) err
(錯(cuò)誤)小作,回調(diào)函數(shù)在文件寫入數(shù)據(jù)成功后執(zhí)行
例:
const fs = require("fs");
fs.writeFile("./txt.txt", "Hello FS 你好", err => {
if (!err) {
fs.readFile("./txt.txt", "utf8", (err, data) => {
console.log(data); // Hello FS 你好
});
}
});
文件追加寫入
同步追加寫入appendFileSync有三個(gè)參數(shù)
第一個(gè)參數(shù)為寫入文件的路徑或文件描述符亭姥;
第二個(gè)參數(shù)為寫入的數(shù)據(jù),類型為 String 或 Buffer顾稀;
第三個(gè)參數(shù)為 options
达罗,默認(rèn)值為 null
,其中有 encoding
(編碼静秆,默認(rèn)為 utf8
)粮揉、 flag
(標(biāo)識(shí)位巡李,默認(rèn)為 a
)和 mode
(權(quán)限位,默認(rèn)為 0o666
)扶认,也可直接傳入 encoding
例:
const fs = require("fs");
fs.appendFileSync("./txt.txt", "我是一名程序員");
let result = fs.readFileSync("./txt.txt", "utf8");
console.log(result); // Hello FS 你好我是一名程序員
異步追加寫入appendFile侨拦,有四個(gè)參數(shù)
異步追加寫入方法 appendFile
與 appendFileSync
的前三個(gè)參數(shù)相同,最后一個(gè)參數(shù)為回調(diào)函數(shù)蝠引,函數(shù)內(nèi)有一個(gè)參數(shù) err
(錯(cuò)誤)阳谍,回調(diào)函數(shù)在文件追加寫入數(shù)據(jù)成功后執(zhí)行
例:
const fs = require("fs");
fs.appendFile("./txt.txt", "2333", err => {
if (!err) {
fs.readFile("./txt.txt", "utf8", (err, data) => {
console.log(data); // Hello FS 你好我是一名程序員,2333
});
}
});
文件拷貝寫入
同步拷貝寫入copyFileSync,兩個(gè)參數(shù)
同步拷貝寫入方法 copyFileSync
有兩個(gè)參數(shù),第一個(gè)參數(shù)為被拷貝的源文件路徑螃概,第二個(gè)參數(shù)為拷貝到的目標(biāo)文件路徑矫夯,如果目標(biāo)文件不存在,則會(huì)創(chuàng)建并拷貝
例:
const fs = require("fs");
fs.copyFileSync("./txt.txt", "a.txt");
let result = fs.readFileSync("a.txt", "utf8");
console.log(result); // Hello FS 你好我是一名程序員,2333
異步寫入拷貝copyFile,兩個(gè)參數(shù)
異步拷貝寫入方法 copyFile
和 copyFileSync
前兩個(gè)參數(shù)相同吊洼,最后一個(gè)參數(shù)為回調(diào)函數(shù)训貌,在拷貝完成后執(zhí)行。
例:
const fs = require("fs");
fs.copyFile("./txt.txt", "a.txt", () => {
fs.readFile("a.txt", "utf8", (err, data) => {
console.log(data); // Hello FS 你好我是一名程序員,2333
});
});
stream(流)
在Node.js中冒窍,流(stream)就是一系列從A點(diǎn)到B點(diǎn)移動(dòng)的數(shù)據(jù)递沪。完整點(diǎn)的說(shuō),就是當(dāng)你有一個(gè)很大的數(shù)據(jù)需要傳輸综液、搬運(yùn)時(shí)款慨,你不需要等待所有數(shù)據(jù)都傳輸完成才開始下一步工作。實(shí)際上谬莹,巨型數(shù)據(jù)會(huì)被分割成小塊(chunks)進(jìn)行傳輸檩奠。所以,buffer的原始定義中所說(shuō)的(“streams of binary data… in the context of… file system”)意思就是說(shuō)二進(jìn)制數(shù)據(jù)在文件系統(tǒng)中的傳輸附帽。比如埠戳,將a.txt的文字存儲(chǔ)到b.txt中
Buffer(緩沖區(qū))介紹
JavaScript 語(yǔ)言沒有用于讀取或操作二進(jìn)制數(shù)據(jù)流的機(jī)制。 Buffer
類是作為 Node.js API 的一部分引入的蕉扮,用于在 TCP(面向連接的整胃、可靠的、基于字節(jié)流的傳輸層通信協(xié)議) 流喳钟、文件系統(tǒng)操作屁使、以及其他上下文中與八位字節(jié)流進(jìn)行交互或者可以理解為處理二進(jìn)制數(shù)據(jù)流;
Buffer.alloc
創(chuàng)建的緩沖區(qū)是被初始化過(guò)的奔则,所有的項(xiàng)都用00填充
例:
let buf1 = Buffer.alloc(6);
//創(chuàng)建長(zhǎng)度為6的緩沖區(qū)
console.log(buf1);
// <Buffer 00 00 00 00 00 00>
Buffer.allocUnsafe
創(chuàng)建的 Buffer 并沒有經(jīng)過(guò)初始化蛮寂,在內(nèi)存中只要有閑置的 Buffer 就直接 “抓過(guò)來(lái)” 使用
例:
let buf2 = Buffer.allocUnsafe(6);
//創(chuàng)建長(zhǎng)度為6的緩沖區(qū)
console.log(buf2);
// <Buffer 00 e7 8f a0 00 00>
Buffer.allocUnsafe 創(chuàng)建 Buffer 使得內(nèi)存的分配非常快应狱,但已分配的內(nèi)存段可能包含潛在的敏感數(shù)據(jù)共郭,有明顯性能優(yōu)勢(shì)的同時(shí)又是不安全的祠丝,所以使用需格外小心
Buffer.from
支持三種傳參方式
第一個(gè)參數(shù)為字符串疾呻,第二個(gè)參數(shù)為字符編碼除嘹,如 ASCII
、UTF-8
岸蜗、Base64
等等尉咕。
傳入一個(gè)數(shù)組,數(shù)組的每一項(xiàng)會(huì)以十六進(jìn)制存儲(chǔ)為 Buffer 的每一項(xiàng)璃岳。
傳入一個(gè) Buffer年缎,會(huì)將 Buffer 的每一項(xiàng)作為新返回 Buffer 的每一項(xiàng)。
例:
// 傳入字符串和字符編碼
let buf = Buffer.from("hello", "utf8");
console.log(buf); // <Buffer 68 65 6c 6c 6f>
//傳入數(shù)組
// 數(shù)組成員為十進(jìn)制數(shù)
let buf = Buffer.from([1, 2, 3]);
console.log(buf); // <Buffer 01 02 03>
// 數(shù)組成員為十六進(jìn)制數(shù)
let buf = Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd]);
console.log(buf); // <Buffer e4 bd a0 e5 a5 bd>
console.log(buf.toString("utf8")); // 你好
在 NodeJS 中不支持 GB2312
編碼铃慷,默認(rèn)支持 UTF-8
单芜,在 GB2312
中,一個(gè)漢字占兩個(gè)字節(jié)犁柜,而在 UTF-8
中洲鸠,一個(gè)漢字占三個(gè)字節(jié),所以上面 “你好” 的 Buffer 為 6
個(gè)十六進(jìn)制數(shù)組成馋缅。
例:
// 數(shù)組成員為字符串類型的數(shù)字
let buf = Buffer.from(["1", "2", "3"]);
console.log(buf); // <Buffer 01 02 03>
傳入的數(shù)組成員可以是任何進(jìn)制的數(shù)值扒腕,當(dāng)成員為字符串的時(shí)候,如果值是數(shù)字會(huì)被自動(dòng)識(shí)別成數(shù)值類型萤悴,如果值不是數(shù)字或成員為是其他非數(shù)值類型的數(shù)據(jù)瘾腰,該成員會(huì)被初始化為 00
。
創(chuàng)建的 Buffer 可以通過(guò) toString
方法直接指定編碼進(jìn)行轉(zhuǎn)換覆履,默認(rèn)編碼為 UTF-8
例:
// 傳入一個(gè) Buffer
let buf1 = Buffer.from("hello", "utf8");
let buf2 = Buffer.from(buf1);
console.log(buf1); // <Buffer 68 65 6c 6c 6f>
console.log(buf2); // <Buffer 68 65 6c 6c 6f>
console.log(buf1 === buf2); // true
console.log(buf1[0] === buf2[0]); // false
當(dāng)傳入的參數(shù)為一個(gè) Buffer 的時(shí)候蹋盆,會(huì)創(chuàng)建一個(gè)新的 Buffer 并復(fù)制上面的每一個(gè)成員。
Buffer 為引用類型内狗,一個(gè) Buffer 復(fù)制了另一個(gè) Buffer 的成員怪嫌,當(dāng)其中一個(gè) Buffer 復(fù)制的成員有更改,另一個(gè) Buffer 對(duì)應(yīng)的成員會(huì)跟著改變柳沙,因?yàn)橹赶蛲粋€(gè)引用岩灭,類似于 “二維數(shù)組”。
例:
// Buffer 類比二維數(shù)組
let arr1 = [1, 2, [3]];
let arr2 = arr1.slice();
arr2[2][0] = 5;
console.log(arr1); // [1, 2, [5]]
打開文件赂鲤,open,四個(gè)參數(shù)
path:文件的路徑噪径;
flag:標(biāo)識(shí)位;
mode:權(quán)限位数初,默認(rèn) 0o666
找爱;
callback:回調(diào)函數(shù),有兩個(gè)參數(shù) err
(錯(cuò)誤)和 fd
(文件描述符)泡孩,打開文件后執(zhí)行
例:
const fs = require("fs");
fs.open("./txt.txt", "r", (err, fd) => {
console.log(fd);
});
關(guān)閉文件close
close
方法有兩個(gè)參數(shù)车摄,第一個(gè)參數(shù)為關(guān)閉文件的文件描述符 fd
,第二參數(shù)為回調(diào)函數(shù),回調(diào)函數(shù)有一個(gè)參數(shù) err
(錯(cuò)誤)吮播,關(guān)閉文件后執(zhí)行
例:
const fs = require("fs");
fs.open("./txt.txt", "r", (err, fd) => {
fs.close(fd, err => {
console.log("關(guān)閉成功");
});
});
讀取文件read变屁,有六個(gè)參數(shù)
read
方法與 readFile
不同,一般針對(duì)于文件太大意狠,無(wú)法一次性讀取全部?jī)?nèi)容到緩存中或文件大小未知的情況粟关,都是多次讀取到 Buffer 中
fd:文件描述符,需要先使用 open 打開环戈;
buffer:要將內(nèi)容讀取到的 Buffer闷板;
offset:整數(shù),向 Buffer 寫入的初始位置院塞;
length:整數(shù)遮晚,讀取文件的長(zhǎng)度;
position:整數(shù)拦止,讀取文件初始位置鹏漆;
callback:回調(diào)函數(shù),有三個(gè)參數(shù) err
(錯(cuò)誤)创泄,bytesRead
(實(shí)際讀取的字節(jié)數(shù))艺玲,buffer
(被寫入的緩存區(qū)對(duì)象),讀取執(zhí)行完成后執(zhí)行鞠抑。
例:
const fs = require("fs");
let buf = Buffer.alloc(6);
// 打開文件
fs.open("./txt.txt", "r", (err, fd) => {
// 讀取文件
fs.read(fd, buf, 0, 3, 0, (err, bytesRead, buffer) => {
console.log(bytesRead);
console.log(buffer);
// 繼續(xù)讀取
fs.read(fd, buf, 3, 3, 3, (err, bytesRead, buffer) => {
console.log(bytesRead);
console.log(buffer);
console.log(buffer.toString());
});
});
});
寫入文件write,六個(gè)參數(shù)
fd:文件描述符饭聚,需要先使用 open
打開;
buffer:存儲(chǔ)將要寫入文件數(shù)據(jù)的 Buffer搁拙;
offset:整數(shù)秒梳,從 Buffer 讀取數(shù)據(jù)的初始位置;
length:整數(shù)箕速,讀取 Buffer 數(shù)據(jù)的字節(jié)數(shù)酪碘;
position:整數(shù),寫入文件初始位置盐茎;
callback:回調(diào)函數(shù)兴垦,有三個(gè)參數(shù) err
(錯(cuò)誤),bytesWritten
(實(shí)際寫入的字節(jié)數(shù))字柠,buffer
(被讀取的緩存區(qū)對(duì)象)探越,寫入完成后執(zhí)行
例:
// 選擇范圍寫入
const fs = require("fs");
let buf = Buffer.from("你還好嗎");
// 打開文件
fs.open("./txt.txt", "r+", (err, fd) => {
// 讀取 buf 向文件寫入數(shù)據(jù)
fs.write(fd, buf, 3, 6, 3, (err, bytesWritten, buffer) => {
// 同步磁盤緩存
fs.fsync(fd, err => {
// 關(guān)閉文件
fs.close(fd, err => {
console.log("關(guān)閉文件");
});
});
});
});
// 這里為了看是否寫入成功可直接使用 readFile 方法
fs.readFile("./txt.txt", "utf8", (err, data) => {
console.log(data);
});
獲取文件目錄stats
文件目錄的 Stats
對(duì)象存儲(chǔ)著關(guān)于這個(gè)文件或文件夾的一些重要信息,如創(chuàng)建時(shí)間窑业、最后一次訪問的時(shí)間钦幔、最后一次修改的時(shí)間、文章所占字節(jié)和判斷文件類型的多個(gè)方法等等
同步獲取stats方法statSync
statSync
方法參數(shù)為一個(gè)目錄的路徑常柄,返回值為當(dāng)前目錄路徑的 Stats
對(duì)象鲤氢,現(xiàn)在通過(guò) Stats
對(duì)象獲取 a
目錄下的 b
目錄下的 c.txt
文件的字節(jié)大小搀擂,文件內(nèi)容為 “你好”
例:
const fs = require("fs");
let statObj = fs.statSync("a/b/c.txt");
console.log(statObj.size); // 6
異步獲取stats方法stat
stat
方法的第一個(gè)參數(shù)為目錄的路徑,最后一個(gè)參數(shù)為回調(diào)函數(shù)卷玉,回調(diào)函數(shù)有兩個(gè)參數(shù) err
(錯(cuò)誤)和 Stats
對(duì)象哥倔,在讀取 Stats
后執(zhí)行,同樣實(shí)現(xiàn)上面的讀取文件字節(jié)數(shù)的例子揍庄。
例:
// 異步獲取 Stats 對(duì)象
const fs = require("fs");
fs.stat("a/b/c.txt", (err, statObj) => {
console.log(statObj.size); // 6
});
創(chuàng)建文件目錄
同步創(chuàng)建文件目錄mkdirSync
mkdirSync
方法參數(shù)為一個(gè)目錄的路徑,沒有返回值东抹,在創(chuàng)建目錄的過(guò)程中蚂子,必須保證傳入的路徑前面的文件目錄都存在,否則會(huì)拋出異常缭黔。
例:
// 同步創(chuàng)建文件目錄
const fs = require("fs");
// 假設(shè)已經(jīng)有了 a 文件夾和 a 下的 b 文件夾
fs.mkdirSync("a/b/c");
異步創(chuàng)建文件目錄mkdir
mkdir
方法的第一個(gè)參數(shù)為目錄的路徑食茎,最后一個(gè)參數(shù)為回調(diào)函數(shù),回調(diào)函數(shù)有一個(gè)參數(shù) err
(錯(cuò)誤)馏谨,在執(zhí)行創(chuàng)建操作后執(zhí)行别渔,同樣需要路徑前部分的文件夾都存在。
例:
// 異步創(chuàng)建文件目錄
const fs = require("fs");
// 假設(shè)已經(jīng)有了 a 文件夾和 a 下的 b 文件夾
fs.mkdir("a/b/c", err => {
if (!err) console.log("創(chuàng)建成功");
});
刪除文件目錄
同步刪除文件目錄rmdirSync
rmdirSync
方法參數(shù)為一個(gè)目錄的路徑惧互,沒有返回值哎媚,在創(chuàng)建目錄的過(guò)程中,必須保證傳入的路徑前面的文件目錄都存在喊儡,否則會(huì)拋出異常拨与。
例:
// 同步刪除文件目錄
const fs = require("fs");
fs.rmdirSync("./ab");
異步刪除文件目錄rmdir
rmdir方法的第一個(gè)參數(shù)為目錄的路徑,最后一個(gè)參數(shù)為回調(diào)函數(shù)艾猜,回調(diào)函數(shù)有一個(gè)參數(shù) err
(錯(cuò)誤)买喧,在執(zhí)行創(chuàng)建操作后執(zhí)行,同樣需要路徑前部分的文件夾都存在匆赃。
例:
// 同步刪除文件目錄
const fs = require("fs");
fs.rmdir("./ab", err => {
if (!err) console.log("刪除成功");
});
讀取文件目錄
同步讀取文件目錄readdirSync淤毛,有兩個(gè)參數(shù)
第一個(gè)參數(shù)為目錄的路徑,傳入的路徑前部分的目錄必須存在算柳,否則會(huì)報(bào)錯(cuò)低淡;
第二個(gè)參數(shù)為 options
,其中有 encoding
(編碼瞬项,默認(rèn)值為 utf8
)查牌,也可直接傳入 encoding
;
返回值為一個(gè)存儲(chǔ)文件目錄中成員名稱的數(shù)組滥壕。
例:
// 同步讀取目錄
const fs = require("fs");
let data = fs.readdirSync("a/b");
console.log(data); // [ 'c', 'index.js' ]
異步讀取文件目錄readdir纸颜,有兩個(gè)參數(shù)
readdir
方法的前兩個(gè)參數(shù)與 readdirSync
相同,第三個(gè)參數(shù)為一個(gè)回調(diào)函數(shù)绎橘,回調(diào)函數(shù)有兩個(gè)參數(shù) err
(錯(cuò)誤)和 data
(存儲(chǔ)文件目錄中成員名稱的數(shù)組)胁孙,在讀取文件目錄后執(zhí)行
例:
// 異步讀取目錄
const fs = require("fs");
fs.readdir("a/b", (err, data) => {
if (!err) console.log(data);
});
// [ 'c', 'index.js' ]
刪除文件操作
同步刪除文件操作unlinkSync
unlinkSync
的參數(shù)為要?jiǎng)h除文件的路徑唠倦,現(xiàn)在存在 a
目錄和 a
目錄下的 index.js
文件,刪除 index.js
文件涮较。
例:
// 同步刪除文件
const fs = require("fs");
fs.unlinkSync("a/inde.js");
異步刪除文件操作unlink
unlink
方法的第一個(gè)參數(shù)與 unlinkSync
相同稠鼻,最后一個(gè)參數(shù)為回調(diào)函數(shù),函數(shù)中存在一個(gè)參數(shù) err
(錯(cuò)誤)狂票,在刪除文件操作后執(zhí)行候齿。
例:
// 異步刪除文件
const fs = require("fs");
fs.unlink("a/index.js", err => {
if (!err) console.log("刪除成功");
});
// 刪除成功
檢測(cè)文件或目錄
同步檢測(cè)existsSync
例:
const fs = require("fs");
let result = fs.existsSync('./a.js');
// true
異步檢測(cè)exists
例:
const fs = require("fs");
let result = fs.existsSync('./a.js', function(flag) {
console.log(flag);
});
// true
__dirname
獲取包含當(dāng)前文件所在文件夾的一個(gè)絕對(duì)路徑
例:
// 當(dāng)前文件index.js
console.log(__dirname);
// /Users/shenjianbo/codes/practise/nodejs/20190624/foo/index.js.aa