入門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è)打開的文件分配一個(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)榍懊嬗?01秉颗、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ù)

異步寫入方法 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ù)都傳輸完成才開始下一步工作。實(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ù)為字符編碼除嘹,如 ASCIIUTF-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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市闺属,隨后出現(xiàn)的幾起案子慌盯,更是在濱河造成了極大的恐慌,老刑警劉巖掂器,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚皂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡国瓮,警方通過(guò)查閱死者的電腦和手機(jī)灭必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乃摹,“玉大人禁漓,你說(shuō)我怎么就攤上這事》醪牵” “怎么了璃饱?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肪康。 經(jīng)常有香客問我荚恶,道長(zhǎng),這世上最難降的妖魔是什么磷支? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任谒撼,我火速辦了婚禮,結(jié)果婚禮上雾狈,老公的妹妹穿的比我還像新娘廓潜。我一直安慰自己,他們只是感情好善榛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布辩蛋。 她就那樣靜靜地躺著,像睡著了一般移盆。 火紅的嫁衣襯著肌膚如雪悼院。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天咒循,我揣著相機(jī)與錄音据途,去河邊找鬼绞愚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颖医,可吹牛的內(nèi)容都是我干的位衩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熔萧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糖驴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起佛致,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贮缕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晌杰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筷弦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年肋演,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烂琴。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爹殊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奸绷,到底是詐尸還是另有隱情梗夸,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布号醉,位于F島的核電站反症,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏畔派。R本人自食惡果不足惜铅碍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望线椰。 院中可真熱鬧胞谈,春花似錦、人聲如沸憨愉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)配紫。三九已至径密,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躺孝,已是汗流浹背睹晒。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工趟庄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪很。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓戚啥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锉试。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猫十,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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