文件操作
fs概述
在 NodeJS 中姑廉,所有與文件操作都是通過(guò) fs
核心模塊來(lái)實(shí)現(xiàn)的饭望,包括文件目錄的創(chuàng)建、刪除澈侠、查詢以及文件的讀取和寫入劫侧,在 fs
模塊中,所有的方法都分為同步和異步兩種實(shí)現(xiàn),具有 sync
后綴的方法為同步方法烧栋,不具有 sync
后綴的方法為異步方法写妥;
文件描述符fd
操作系統(tǒng)會(huì)為每個(gè)打開(kāi)的文件分配一個(gè)名為文件描述符的數(shù)值標(biāo)識(shí),文件操作使用這些文件描述符來(lái)識(shí)別與追蹤每個(gè)特定的文件审姓,Window 系統(tǒng)使用了一個(gè)不同但概念類似的機(jī)制來(lái)追蹤資源珍特,為方便用戶,NodeJS 抽象了不同操作系統(tǒng)間的差異魔吐,為所有打開(kāi)的文件分配了數(shù)值的文件描述符扎筒。
在 NodeJS 中,每操作一個(gè)文件酬姆,文件描述符是遞增的嗜桌,文件描述符一般從 3
開(kāi)始,因?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)繞開(kāi)本地文件系統(tǒng)緩存击费。
w 寫入文件拢蛋,文件不存在會(huì)被創(chuàng)建,存在則清空后寫入蔫巩。
wx 寫入文件谆棱,排它方式打開(kāi)。
w+ 讀取并寫入文件圆仔,文件不存在則創(chuàng)建文件垃瞧,存在則清空后寫入。
wx+ 和 w+
類似坪郭,排他方式打開(kāi)个从。
a 追加寫入,文件不存在則創(chuàng)建文件。
ax 與 a
類似嗦锐,排他方式打開(kāi)嫌松。
a+ 讀取并追加寫入,不存在則創(chuàng)建意推。
ax+ 與 a+
類似豆瘫,排他方式打開(kāi)。
文件讀取
同步讀取文件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)容,如果沒(mé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ù))剂买,該方法沒(méi)有返回值,回調(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ù)都傳輸完成才開(kāi)始下一步工作原茅。實(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ǔ)言沒(méi)有用于讀取或操作二進(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 并沒(méi)有經(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]]
打開(kāi)文件胎食,open,四個(gè)參數(shù)
path:文件的路徑扰才;
flag:標(biāo)識(shí)位;
mode:權(quán)限位厕怜,默認(rèn) 0o666
训桶;
callback:回調(diào)函數(shù)累驮,有兩個(gè)參數(shù) err
(錯(cuò)誤)和 fd
(文件描述符),打開(kāi)文件后執(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 打開(kāi)赎败;
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);
// 打開(kāi)文件
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
打開(kāi);
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("你還好嗎");
// 打開(kāi)文件
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í)間咐柜、最后一次訪問(wèn)的時(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è)目錄的路徑,沒(méi)有返回值鲫竞,在創(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è)目錄的路徑驹沿,沒(méi)有返回值艘策,在創(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