Node.js的文件系統(tǒng)

Node.js的文件系統(tǒng)

JavaScript的是沒有操作文件的能力宜猜,但是Node.js是可以做到的块请。
Node.js提供了操作文件的接口亡呵,但是接口有太多抬探。主要使用一些常用的接口。

文件系統(tǒng)模塊是一個封裝了標準的 POSIX 文件 I/O 操作的集合衣吠。通過 require('fs') 使用這個模塊茶敏。所有的方法都有同步和異步兩種模式。

Node.js的文件系統(tǒng)API

1.讀取文件
Node.js提供了兩種方式讀取文件缚俏,一個是異步的方式讀取文件惊搏,一個是同步的方式讀取文件。


var fs = require("fs");
// 我們來定義一個函數(shù)忧换,用來讀取文件
function readFile (fileUrl) {
  console.log("--開始讀取--");
  fs.readfile(fileUrl,function(err,data){
    if(err){
      console.log("--讀取失敗--")
    }
    console.log("讀取到的數(shù)據(jù)是:"+data.toString());
  })
}
readFile("./src/test.txt");
// 執(zhí)行函數(shù)恬惯,就能讀取到文件的信息
// 上邊是異步讀取數(shù)據(jù),同步讀取數(shù)據(jù)是
// 同步讀取函數(shù)
function readFileSync(fileUrl) {
    console.log("----開始同步讀取----");
    var data = fs.readFileSync(fileUrl);
    console.log("同步讀取的數(shù)據(jù)是" + data.toString());
    console.log("----讀取結(jié)束----")
}
readFileSync("./src/test.txt");
// 推薦使用異步讀取數(shù)據(jù)亚茬,速度快酪耳,性能好,不會阻塞刹缝;

2.寫入文件

// fs.writeFile(filename,data,[options],callback);
/**
 * filename, 必選參數(shù)碗暗,文件名
 * data, 寫入的數(shù)據(jù),可以字符或一個Buffer對象
 * [options],flag,mode(權限),encoding梢夯,都是選填
 * callback 讀取文件后的回調(diào)函數(shù)言疗,參數(shù)默認err
 */
// 寫文件
var w_data = "我是寫入的內(nèi)容";
fs.writeFile("./src/test.txt",w_data,function (err) {
  if (err) {
    console.error(err);
  }
  console.log("寫入成功")
})
// 有一點不得不提,就是如果你寫入的文件是已經(jīng)存在的文件颂砸,那么之前的內(nèi)容會被覆蓋掉噪奄。
// 下邊的方法就是把你寫入內(nèi)容追加到原來的文件中;

3.追加內(nèi)容


// fs.appendFile(filename,data,[options],callback)
/**
 * filename,必填參數(shù)沾凄,文件名
 * data梗醇,追加的內(nèi)容
 * options知允,選填撒蟀,flag,mode温鸽。保屯。。
 * callback涤垫,默認參數(shù)err
 */
// 追加內(nèi)容
var appendData = "我是被追加的內(nèi)容";
fs.appendFile("./src/test.txt",appendData,function (err) {
  if (err) {
    console.error(err);
  }
  console.log("追加內(nèi)容成功姑尺!")
})

4.關于打開文件,讀取文件蝠猬, 截取文件切蟋,寫入文件,關閉文件榆芦,

4.1 先來看看打開文件

fs.open(filename,flag,[mode],callback)
參數(shù)說明
/**
 * filename,必填參數(shù)
 * flags柄粹,必填參數(shù)喘鸟,詳細參考這些參數(shù)設置
 * mode,選填驻右,設置權限
 * callback什黑,默認參數(shù)第一個err,第二個fd堪夭,這個fd是個啥玩意愕把,解釋如下
 * fd為一個整數(shù),表示打開文件返回的文件描述符森爽,window中又稱文件句柄
 */
/*Flag  描述
r   以讀取模式打開文件恨豁。如果文件不存在拋出異常。
r+  以讀寫模式打開文件爬迟。如果文件不存在拋出異常圣絮。
rs  以同步的方式讀取文件。
rs+ 以同步的方式讀取和寫入文件雕旨。
w   以寫入模式打開文件扮匠,如果文件不存在則創(chuàng)建。
wx  類似 'w'凡涩,但是如果文件路徑存在棒搜,則文件寫入失敗。
w+  以讀寫模式打開文件活箕,如果文件不存在則創(chuàng)建力麸。
wx+ 類似 'w+', 但是如果文件路徑存在育韩,則文件讀寫失敗克蚂。
a   以追加模式打開文件,如果文件不存在則創(chuàng)建筋讨。
ax  類似 'a'埃叭, 但是如果文件路徑存在,則文件追加失敗悉罕。
a+  以讀取追加模式打開文件赤屋,如果文件不存在則創(chuàng)建。
ax+ 類似 'a+'壁袄, 但是如果文件路徑存在类早,則文件讀取追加失敗。
*/

一個實例寫法:

fs.open("./src/test.txt","r+",function (err,fd) {
  if (err) {
    console.error(err);
  }
  console.log(fd)// fd 是一個windows系統(tǒng)的句柄嗜逻,類似于給文件一個標識涩僻,后邊會用到
  // 還記得定時器么,瀏覽器就會給每個定時器一個id,我們每次清除定時器逆日,就是清除對應id的定時器
  console.log("文件被打開了")
  // 文件被打開恼琼,但是,是在內(nèi)存中打開的屏富,你根本看不到的晴竞,不用在這做糾結(jié)。
})

4.2 讀取文件
文件被打開了狠半,那么我肯定是要讀取的呀噩死!

file.read(filename,buffer,offset,length,position,callback)
/**
 * fd, 使用fs.open打開成功后返回的文件描述符
 * buffer, 一個Buffer對象,v8引擎分配的一段內(nèi)存
 * offset, 整數(shù)神年,向緩存區(qū)中寫入時的初始位置已维,以字節(jié)為單位
 * length, 整數(shù),讀取文件的長度
 * position, 整數(shù)已日,讀取文件初始位置垛耳;文件大小以字節(jié)為單位
 * callback(err, bytesRead, buffer), 讀取執(zhí)行完成后回調(diào)函數(shù),bytesRead實際讀取字節(jié)數(shù)飘千,被讀取的緩存區(qū)對象
 */
 

讀取文件的實例:

fs.open("./src/test.txt","r+",function (err,fd) {
    if (err) {
        console.error(err)
    }
    console.log("文件被打開了")
    console.log("準備讀取文件");
    var buffer = new Buffer(1024);
    // fd 在read的時候用到了堂鲜,其實類似于一個文件的標識
    fs.read(fd,buffer,0,buffer.length,0,function (err,bytesRead,buffer) {
        if (err) {
            console.error(err)
        }
        console.log(bytesRead+" 字節(jié)被讀")
        if (bytesRead>0) {
            console.log("讀取的內(nèi)容"+buffer.toString())
        }
    })
})

4.3 截取文件

fs.// fs.ftruncate(fd,len,callback)
/**
 * fd,打開文件時候的fd
 * len,要截取的長度
 * callback,回調(diào)函數(shù),沒有參數(shù)
 */
 

截取文件實例护奈,截取完成后關閉文件:

// 這是一套缔莲,打開文件,截取文件霉旗,讀取文件痴奏,最后關閉文件
fs.open("./src/test.txt","r+",function (err,fd) {
    if (err) {
        console.log(err)
    }
    console.log("打開文件成功!")
    console.log("準備截取文件");
    // 也就是說厌秒,文件被截取之后读拆,能讀到的就是被截取的部分
    fs.ftruncate(fd,10,function (err) {
        if (err) {
            console.log(err)
        }
        console.log("截取文件成功!");
        console.log("開始讀取文件");
        fs.read(fd,buffer,0,buffer.length,0,function (err,bytesRead) {
            if (err) {
                console.error(err)
            }
            console.log(bytesRead+" 字節(jié)被讀取");
            if (bytesRead>0) {
                console.log(buffer.slice(0,bytesRead).toString())
            }
            // 關閉文件
            fs.close(fd,function (err) {
                if (err) {
                    console.log(err)
                }
                console.log("文件關閉")
            })
        })
    })
})
文件被截取之后鸵闪,能讀到就是被截取的部分

4.4 關閉文件
具體用法檐晕,如上例所示

fs.close(fd,callback)
/**
 * fd,打開文件時候的fd
 * callback,回調(diào)函數(shù),參數(shù)err
 */
 

4.5 寫入文件

// fs.write(fd,buffer,offset,length,position,callback);
/**
 * fd, 使用fs.open打開成功后返回的文件描述符
 * buffer, 一個Buffer對象岛马,v8引擎分配的一段內(nèi)存
 * offset, 整數(shù)棉姐,從緩存區(qū)中讀取時的初始位置屠列,以字節(jié)為單位
 * length, 整數(shù)啦逆,從緩存區(qū)中讀取數(shù)據(jù)的字節(jié)數(shù)
 * position, 整數(shù),寫入文件初始位置笛洛;
 * callback(err, written, buffer), 寫入操作執(zhí)行完成后回調(diào)函數(shù)夏志,written實際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對象
 */

寫入文件實例:

fs.open("./src/test.txt","r+",function (err,fd) {
    if (err) {
        console.error(err)
    }
    console.log("文件被打開了");
    console.log("準備寫入文件");
    var buf = new Buffer("寫入的內(nèi)容");
    fs.write(fd,buf,0,buf.length,0,function (err,written,buffer) {
        if (err) {
            console.error(err)
        }
        // 寫入文件的字符數(shù),一個中文沟蔑,utf8編碼三個字節(jié)
        console.log(written);
        // 我們會發(fā)現(xiàn)之前的text.txt文件被改寫了
        console.log(buffer.toString())
    })
    fs.close(fd,function (err) {
        if (err) {
            console.error(err)
        }
        console.log("文件被關閉了")
    })
})

5.獲取文件信息

// fs.stat(filename,callback)
/**
 * filename湿诊,必填參數(shù),文件路徑和文件名稱
 * callback瘦材,第一個參數(shù)err厅须,第二個stats,返回一個文件相關的信息
 */
 

獲取文件信息實例:

fs.stat(__dirname+"/test.txt",function (err,stats) {
    if (err) {
        console.error(err)
    }
    console.log(stats)
})

6.創(chuàng)建文件夾


// fs.mkdir(filname,callback)
/**
 * filename,必填參數(shù)
 * callback食棕,只有一個err參數(shù)
 */
 
 fs.mkdir(__dirname+"/test/",function (err) {
    if (err) {
        console.error(err)
    }
    console.log("文件夾創(chuàng)建成功朗和!")
})

7.讀取文件夾

// fs.readdir(filename,{options},callback)
/**
 * filename,必填參數(shù)
 * options,選填參數(shù)
 * callback簿晓,第一個參數(shù)err眶拉,第二個參數(shù)files,返回的是一個文件的數(shù)組
 */
 

讀取文件夾實例:


// 我們在剛才創(chuàng)建的test文件夾下憔儿,添加兩個文件看看忆植,一個是index.js,index.html
fs.readdir(__dirname+"/test",function (err,files) {
    if (err) {
        console.error(err)
    }
    console.log("讀取文件夾成功!")
    console.log(files)
    files.forEach(function (value,index) {
        console.log(value+"---"+index)
    })
})

8.刪除文件

// fs.unlink(filename,callback)
/**
 * filename,必填參數(shù)
 * callback谒臼,參數(shù)err
 */

刪除文件的實例:


// 在新建的test文件夾內(nèi)在新建一個index.txt文件朝刊,然后我們再把它刪掉
fs.unlink(__dirname+"/test/index.txt",function (err) {
    if (err) {
        console.error(err)
    }
    console.log("刪除成功!")
})

9.刪除文件夾

fs.rmdir(fliename,callback);
/**
 * filename,必填參數(shù)
 * callback蜈缤,參數(shù)err
 */
 
// 清空文件夾坞古,同步操作
function cleanDir(filename) {
    // 采用同步的方式讀目標文件夾,獲取files對象
    var files = fs.readdirSync(filename);
    // 遍歷files對象劫樟,直接forEach了
    files.forEach((item) => {
        var stats = fs.statSync(filename+"/"+item);
        // 判斷當前是文件還是文件夾
        if (stats.isDirectory()) {
            // 如果是文件夾就重復調(diào)用方法
            cleanDir(filename+"/"+item)
        }else{
            // 如果不是文件夾痪枫,那就是文件,直接刪除
            fs.unlinkSync(filename+"/"+item);
            console.log("刪除文件"+filename+"/"+item+"成功")
        }
    })
}

// 刪除每個空文件夾叠艳,同步操作
function deleteDir(filename) {
    // 同步方式讀取文件夾奶陈,得到files
    var files = fs.readdirSync(filename);
    // 判斷files下是否存在別的文件夾,也就是判斷l(xiāng)ength
    if (files.length>0) {
        var tempFile = 0;
        files.forEach((item) => {
            tempFile++;
            deleteDir(filename+"/"+item);
        })
        // 如果把子文件夾都刪除了附较,那么母文件夾的filename和上述的不同吃粒,需要單獨列出來,
        // 做一步判斷拒课,然后刪除母文件夾
        if (tempFile==files.length) {
            fs.rmdirSync(filename)
            console.log("刪除文件夾"+filename+"成功")
        }
    }else{
        fs.rmdirSync(filename)
        console.log("刪除文件夾"+filename+"成功")
    }
}
cleanDir(__dirname + "/test");
deleteDir(__dirname + "/test");

基本上Node.js的文件系統(tǒng)最常用的api,大體都接觸了一遍徐勃。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市早像,隨后出現(xiàn)的幾起案子僻肖,更是在濱河造成了極大的恐慌,老刑警劉巖卢鹦,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臀脏,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機揉稚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門秒啦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搀玖,你說我怎么就攤上這事余境。” “怎么了灌诅?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵葛超,是天一觀的道長。 經(jīng)常有香客問我延塑,道長绣张,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任关带,我火速辦了婚禮侥涵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宋雏。我一直安慰自己芜飘,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布磨总。 她就那樣靜靜地躺著嗦明,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚪燕。 梳的紋絲不亂的頭發(fā)上娶牌,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音馆纳,去河邊找鬼诗良。 笑死,一個胖子當著我的面吹牛鲁驶,可吹牛的內(nèi)容都是我干的鉴裹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼钥弯,長吁一口氣:“原來是場噩夢啊……” “哼径荔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脆霎,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤总处,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绪穆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辨泳,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡虱岂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年玖院,在試婚紗的時候發(fā)現(xiàn)自己被綠了菠红。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡难菌,死狀恐怖试溯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郊酒,我是刑警寧澤遇绞,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站燎窘,受9級特大地震影響摹闽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褐健,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一付鹿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚜迅,春花似錦舵匾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刹帕,卻和暖如春吵血,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷溺。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工践瓷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亡蓉。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓晕翠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砍濒。 傳聞我的和親對象是個殘疾皇子淋肾,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)爸邢,斷路器樊卓,智...
    卡卡羅2017閱讀 134,662評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法杠河,內(nèi)部類的語法碌尔,繼承相關的語法浇辜,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • Node.js是目前非惩倨荩火熱的技術柳洋,但是它的誕生經(jīng)歷卻很奇特。 眾所周知叹坦,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,616評論 2 41
  • Node.js是目前非承芰停火熱的技術,但是它的誕生經(jīng)歷卻很奇特募书。 眾所周知绪囱,在Netscape設計出JavaScri...
    Myselfyan閱讀 4,072評論 2 58
  • 剛認識了一位新朋友,說是朋友莹捡,其實她是客戶鬼吵,因為在工作聊得很投機,也就算是一個新朋友吧篮赢! 第一次見到她是在11月左...
    郭顏閱讀 246評論 0 0