入門nodejs文件系統(tǒng)

文件操作

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ù)

異步寫入方法 writeFilewriteFileSync 的前三個(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ù)

異步追加寫入方法 appendFileappendFileSync 的前三個(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ù)

異步拷貝寫入方法 copyFilecopyFileSync 前兩個(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市磅甩,隨后出現(xiàn)的幾起案子炊林,更是在濱河造成了極大的恐慌,老刑警劉巖卷要,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣聚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡僧叉,警方通過(guò)查閱死者的電腦和手機(jī)奕枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瓶堕,“玉大人隘道,你說(shuō)我怎么就攤上這事±砂剩” “怎么了谭梗?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宛蚓。 經(jīng)常有香客問(wèn)我激捏,道長(zhǎng),這世上最難降的妖魔是什么凄吏? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任远舅,我火速辦了婚禮,結(jié)果婚禮上痕钢,老公的妹妹穿的比我還像新娘图柏。我一直安慰自己,他們只是感情好盖喷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著难咕,像睡著了一般课梳。 火紅的嫁衣襯著肌膚如雪距辆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天暮刃,我揣著相機(jī)與錄音跨算,去河邊找鬼。 笑死椭懊,一個(gè)胖子當(dāng)著我的面吹牛诸蚕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氧猬,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼背犯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了盅抚?” 一聲冷哼從身側(cè)響起漠魏,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妄均,沒(méi)想到半個(gè)月后柱锹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丰包,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年禁熏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑彪。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞧毙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锌蓄,到底是詐尸還是另有隱情升筏,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布瘸爽,位于F島的核電站您访,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剪决。R本人自食惡果不足惜灵汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柑潦。 院中可真熱鬧享言,春花似錦、人聲如沸渗鬼。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)譬胎。三九已至差牛,卻和暖如春命锄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偏化。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工脐恩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侦讨。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓驶冒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親韵卤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骗污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容