Node.js學(xué)習(xí)——常用fs模塊

    1. fs.stat 檢測是文件還是目錄
    1. fs.mkdir 創(chuàng)建目錄
    1. fs.writeFile 創(chuàng)建寫入文件
    1. fs.appendFile 追加文件
    1. fs.readFile 異步讀取文件,(fs.readFileSync 同步讀取文件)
    1. fs.readdir 讀取目錄
    1. fs.rename 重命名
    1. fs.rmdir 刪除目錄
    1. fs.unlink 異步刪除文件,(fs.unlinkSync同步刪除文件)

fs提供讀寫方法,對應(yīng)參數(shù):

  • path:要打開的文件路徑活文件描述
  • file:協(xié)議的URL對象作為fs操作的路徑
  • flags:文件打開的模式
  • mode:設(shè)置文件權(quán)限
flags的選項(xiàng)字符串及其含義
  • 'a':打開文件用于追加。如果文件不存在,則創(chuàng)建該文件。
  • 'a+':打開文件用于讀取和追加。如果文件不存在,則創(chuàng)建該文件。
  • 'as+'打開文件用于讀取和追加(在同步模式中)。如果文件不存在,則創(chuàng)建該文件。
  • 'r':打開文件用于讀取。如果文件不存在,則會(huì)發(fā)生異常。
  • 'rs+':打開文件用于讀取和寫入(在同步模式中)。指示操作系統(tǒng)繞過本地的文件系統(tǒng)緩存。
  • 'w+':打開文件用于讀取和寫入。如果文件不存在則創(chuàng)建文件,如果文件存在則截?cái)辔募?/li>

同步打開文件并寫入內(nèi)容

const fs = require('fs');
const fd = fs.openSync('./test.txt', 'rs+');

fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加內(nèi)容
    if (err) throw err; // 如果寫入失敗將拋出錯(cuò)誤
    console.log(written); // 返回寫入的字符串的所占字節(jié)數(shù)(注意:1個(gè)漢字占3個(gè)字節(jié))
    console.log(str); // 返回寫入的文件內(nèi)容
})

異步打開文件并寫入內(nèi)容

const fs = require('fs');       // 操作文件必須引入fs文件模塊(包)
fs.open('./test.txt', 'rs+', (err, fd) => { // 以異步方式打開文件,fd為文件指針,指向所打開的文件
    if (err) {
        console.log('文件打開失??!');
        return false;
    }
/*
    fs.write(fd,string[,position[,encoding]], callback)  一般不用    
    用于將 string 寫入到 fd 指定的文件
    --fd 文件路徑或文件描述符,必選;
    --string 要寫入的字符串內(nèi)容,也可以是一個(gè)buffer
    --position 數(shù)據(jù)要被寫入的位置;
    --encoding 是期望的字符串編碼,默認(rèn)值: utf8;
    --callback 回調(diào)會(huì)接收到參數(shù)(err, written, string)
    written 指定傳入的字符串中寫入的字節(jié)數(shù)。
    被寫入的字節(jié)數(shù)不一定與被寫入的字符串字符數(shù)相同
*/   
    fs.write(fd, 'How are you?', (err, written, str) => { // 向fd所指向的文件添加內(nèi)容
        if (err) throw err;     // 如果寫入失敗將拋出錯(cuò)誤
        console.log(written);       // 返回寫入的字符串的所占字節(jié)數(shù)(注意:1個(gè)漢字占3個(gè)字節(jié))
        console.log(str);       // 返回寫入的文件內(nèi)容
    })
})

fs.closeSync(fd)同步關(guān)閉文件
fs.close(fd,callback)異步關(guān)閉文件,異步關(guān)閉存在回調(diào)函數(shù),內(nèi)部只有1異常參數(shù)err

const fs = require('fs');

fs.open('./test.txt', 'rs+', (err, fd) => {
    if (err) {
        console.log('文件打開失?。?);
        return false;
    }
    fs.close(fd, err => {
        if (err) throw err;
        // 關(guān)閉文件的回調(diào)函數(shù)體
    })
})
const fs = require('fs')
// data.isFile() 判斷是否為文件
// data.isDirectory()判斷是否為目錄
/*
    fs.stat('./html', (err, data) => {
        if (err) {
            console.log(err);
            return;
        }
        console.log(`是文件:${data.isFile()}`);
        console.log(`是目錄:${data.isDirectory()}`);
    })
*/

/*
fs.mkdir()傳遞的三個(gè)參數(shù)
path 將創(chuàng)建的目錄路徑
mode 目錄權(quán)限(讀寫權(quán)限),默認(rèn)777
callback 回調(diào),傳遞異常參數(shù)err
*/
/*
fs.mkdir('./css', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('創(chuàng)建成功');
})
*/

/*
// 寫入文件時(shí),如果文件存在就直接覆蓋,如果文件不存在就直接創(chuàng)建并寫入
    /*
        filename      (String)            文件名稱
        data        (String | Buffer)    將要寫入的內(nèi)容,可以使字符串 或 buffer數(shù)據(jù)。
        options        (Object)           option數(shù)組對象,包含:
        · encoding   (string)            可選值,默認(rèn) ‘utf8′,當(dāng)data使buffer時(shí),該值應(yīng)該為 ignored。
        · mode         (Number)        文件讀寫權(quán)限,默認(rèn)值 438
        · flag            (String)            默認(rèn)值 ‘w'
        callback {Function}  回調(diào),傳遞一個(gè)異常參數(shù)err。
    */
fs.writeFile('./html/index.html', '你好Node.js', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('創(chuàng)建寫入文件成功');
})
*/

// 追加文件時(shí),如果文件存在就直接在文件后追加內(nèi)容,如果文件不存在就直接創(chuàng)建并寫入
/*
fs.appendFile('./css/style.css', 'h1{color:red}\n', (err) => {

    if (err) {
        console.log(err);
        return;
    }
    console.log('appendFile成功');
})
*/
// 同步讀取文件
/*
let orders = fs.readFileSync('./html/index.html', 'utf-8');
console.log(orders);
*/

/*
fs.readFile(path[, options], callback)
options:
  --encoding:編碼方式,默認(rèn)值: null;
  --flag:文件系統(tǒng)flag 的支持。默認(rèn)值為‘r‘
callback:說明異步讀取文件的回調(diào)函數(shù),傳入兩個(gè)參數(shù)(err, data)
    err:異常出錯(cuò)信息;
    data:讀取文件內(nèi)容,若未指定字符編碼,返回原始buffer
 */
/*
fs.readFile('./html/index.html', 'utf-8', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
    console.log(data.toString()); // 將Buffer轉(zhuǎn)換為string類型  ,不加utf-8就需要加這一句
})
*/
/*
fs.readdir('./html', (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log(data);
})
*/
// 重命名或移動(dòng)的功能
// 重命名
// fs.rename('./html/a.html', './html/b.html', (err, data) => {
//     if (err) {
//         console.log(err);
//         return
//     }
//     console.log(data);
// })
// 移動(dòng)
/*
fs.rename('./html/b.html', './css/b.css', (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log('移動(dòng)文件成功');
})
*/
// 刪除目錄,如果不加第二個(gè)參數(shù){recursive: true }只能刪除空目錄而不能刪除有文件的目錄
/*
fs.rmdir('./aaa', { recursive: true }, (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log('刪除目錄成功');
})
*/
// 刪除文件
fs.unlink('./css/b.css', (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    console.log('刪除文件成功');
})

操作

檢查upload目錄是否存在,不存在就創(chuàng)建一個(gè)

const fs = require('fs')
let path = './upload'

fs.stat(path, (err, data) => {
    if (err) {
        console.log(err);
        mkdir(path)
        return
    }
    if (!data.isDirectory) {
        fs.unlink(path, (err, data) => {
            if (!err) {
                mkdir(path)
            } else {
                console.log('檢查文件格式是否正確');
            }

        })
    } else {
        console.log('目錄已經(jīng)存在');
    }
})

function mkdir(dir) {
    fs.mkdir(dir, (err, data) => {
        if (err) {
            console.log(err);
            return
        }
    })
}

對于文件的操作還可以使用三方庫mkdirp https://www.npmjs.com/package/mkdirp

var mkdirp = require('mkdirp');

mkdirp('./upload/aaa/xxxx', function (err) {
    if (err) {
        console.error(err);
    }
});

在一個(gè)目錄中找出所有的目錄,并將目錄的名稱放入一個(gè)數(shù)組中
注意:fs里面的方法是異步
方法一,使用閉包的方式:

const fs = require('fs');
let path = '../wwwroot';
let dirArr = [];
fs.readdir(path,(err,data)=>{
    if(err){
        console.log(err);
        return;
    }
    (function yy(i){
        if(i === data.length){
            console.log(dirArr);
            return;
        }
        let pathName = path + '/' + data[i];
        fs.stat(pathName,(err,ret)=>{
            if(ret.isDirectory()){
                dirArr.push(data[i])
            }
            yy(i+1)
        })
    })(0)
})

方法二:使用async和await

const fs = require('fs');
function isDirec(pathName){
    return new Promise((resolve,reject)=>{
        fs.stat(pathName,(err,ret)=>{
            if(err){
                console.log(err);
                reject(err);
                return;
            }
            if(ret.isDirectory()){
                resolve(true)
            }else{
                resolve(false)
            }
        })
    })
}

function main(){
    let path = '../wwwroot';
    let dirArr = [];
    fs.readdir(path, async (err,data)=>{
        if(err){
            console.log(err);
            return;
        }
        for(let i = 0; i < data.length; i++){
            let pathName = path + '/' + data[i];
            if(await isDirec(pathName)){
                dirArr.push(data[i])
            }
        }
        console.log(dirArr);
    })    
}
main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 通過一個(gè)簡單的 node 命令行的 todo 項(xiàng)目學(xué)習(xí)了 nodejs 文件模塊,收獲頗多。 Github 源碼[...
    Yandhi233閱讀 423評論 0 3
  • 1、Node.js的初步 (1)下載node.js:https://nodejs.org/zh-cn/ (2)配置...
    Z_Hao_f3f1閱讀 197評論 0 0
  • 1.Node.js概述 基于谷歌的V8引擎,運(yùn)行在服務(wù)器端的JS解釋器。官網(wǎng):www.nodejs.org[htt...
    栗子樹下_閱讀 399評論 0 0
  • node中的模塊: commonJs 模塊是Node.js 應(yīng)用程序的基本組成部分,文件和模塊是一一對應(yīng)的。換言之...
    淡退閱讀 445評論 0 0
  • nodejs res.end()一定要寫,否則瀏覽器將會(huì)進(jìn)入無限加載的假死狀態(tài)。 即使已經(jīng)寫了charset='u...
    Lnevan閱讀 1,917評論 0 3

友情鏈接更多精彩內(nèi)容