node.js中fs文件系統模塊的使用


node.js中為我們提供了fs文件系統模塊,實現對文件或目錄的創建,修改和刪除等操作。

fs模塊中,所有的方法分為同步和異步兩種實現。

有 sync 后綴的方法為同步方法,沒有 sync 后綴的方法為異步方法。

一、文件的整個讀取

const fs = require('fs');

//參數一表示讀取的文件
//參數二表示讀取的配置,{encoding:'null', flag:'r'}
//encoding 表示編碼方式
//flag 表示文件系統標志
//如果沒有指定參數二中的encoding,則data返回的是一個Buffer
fs.readFile('./1.txt', function (err, data) {
    console.log(data);
});

//如果指定了,則data返回的是解析后的字符串
fs.readFile('./1.txt', {'encoding': 'utf8', 'flag': 'r'}, function (err, data) {
    console.log(data);
});  

或同步讀取:

const fs = require('fs');

let data = fs.readFileSync('./1.txt');
console.log(data);

let data2 = fs.readFileSync('./1.txt', {'encoding': 'utf8'});
console.log(data2);

二、往文件寫入數據

const fs = require('fs');

//參數一表示需要寫入的文件
//參數二表示寫入的數據
//參數三表示寫入配置 {encoding:'utf8', mode:'0o666', flag:'w'}
//encoding 表示文件編碼
//mode 表示文件權限
//flag 表示表示文件系統標志
fs.writeFile('./1.txt', '數據', {'mode': 0o666, 'flag': 'w'}, function (err) {
    console.log(err);
});

//注意如果文件已存在,默認會覆蓋寫入
fs.writeFile('./1.txt', '你好', function (err) {
    console.log(err);
});

//如果想追加寫入,將flag設置為'a'就可以了。
fs.writeFile('./1.txt', '你好', {'flag': 'a'}, function (err) {
    console.log(err);
});

注意,writeFile() 默認會以覆蓋的方式寫入數據。

或者同步寫入數據:

const fs = require('fs');

fs.writeFileSync('./1.txt', '數據');

關於 mode 文件權限的說明:

在linux中文件的權限會為3種,4-表示可讀,2-表示可寫,1-表示可執行。它們之間的相互組合形成不同權限。

對於文件,有三個權限分配,1:文件所有者,2:文件所屬組,3:其他用戶。

關於 flag 文件系統標志的說明:

r 表示 讀取
表示 寫入
表示 同步
表示 追加
表示 文件存在就報錯
表示 增加相反操作

 r+ 與 w+ 區別,文件不存在時,r+ 不會創建文件,而 w+ 會創建。如果文件存在 r+ 不會清空文件,而 w+ 會清空文件。

三、往文件中追加數據

const fs = require('fs');

fs.appendFile('./1.txt', '數據', function (err) {
    console.log(err);
});

fs.appendFileSync('./1.txt', '同步追加');

四、拷貝文件

const fs = require('fs');

//參數一表示源文件
//參數二表示目標文件
//參數三表示拷貝操作的修飾符,默認0
//參數四表示回調函數
fs.copyFile('./1.txt', './2.txt', function (err) {
    console.log(err);
});

//同步拷貝文件
fs.copyFileSync('./1.txt', './3.txt');

五、打開文件,讀取文件,寫入文件

const fs = require('fs');

//參數一表示文件路徑
//參數二表示文件系統標志
//參數三表示文件權限
//參數四表示回調函數,err表示錯誤,fd表示文件描述符,是一個整型
fs.open('./1.txt', 'r+', 0o666, function (err, fd) {
    //創建一個3字節的Buffer,用來接收數據
    let rbuf = Buffer.alloc(3);
    //參數一表示文件描述符
    //參數二表示接收數據的Buffer
    //參數三表示往Buffer中寫入的偏移量
    //參數四表示讀取的字節數
    //參數五表示從文件中讀取的位置,如果為null,則是文件的當前位置讀取
    //參數六表示回調函數,err表示錯誤,bytesRead表示實際讀取的字節,buffer表示接收數據的Buffer
    fs.read(fd, rbuf, 0, 3, 0, function (err, bytesRead, buffer) {
        console.log(rbuf.toString());
        console.log(bytesRead);
    });

    let wbuf = Buffer.from('中國');
    //參數一表示文件描述符
    //參數二表示寫入數據的Buffer
    //參數三表示往Buffer中讀取的偏移量
    //參數四表示寫入的字節數
    //參數五表示從文件中寫入的位置,如果不等於數字,則從文件的當前位置寫入
    //參數六表示回調函數,err表示錯誤,written表示實際寫入的字節數,buffer表示寫入數據的Buffer
    fs.write(fd, wbuf, 0, 3, fs.stat, function (err, written, buffer) {
        console.log(written);
    });
}); 

六、同步磁盤緩存,把緩沖區數據刷新到文件中。

const fs = require('fs');

fs.open('./1.txt', 'w+', 0o666, function (err, fd) {
    let data = Buffer.from('數據\n');
    let task = [];
    //我們往文件中循環寫入數據
    for (ix = 0; ix < 1000; ix++) {
        task.push(function () {
            return new Promise((resolve, reject) => {
                fs.write(fd, data, 0, data.length, null, function (err, written, buffer) {
                    if (err) {
                        reject(err);
                    } else {
                        resolve(written);
                    }
                });
            });
        });
    }

    Promise.all(task.map(fn => fn())).then(value => {
        console.log(value);
    }, reason => {
        console.log(reason);
    });

    //當們寫完數據后,一般會強制刷新緩沖區,讓數據寫入到文件里,然后關閉文件。
    //因為系統為了效率,我們寫入的數據通常會放到一個緩沖區中,當緩沖區滿了后,系統就一次把數據寫到文件。
    fs.fsync(fd, function (err) {
        console.log(err);
        //關閉文件
        fs.close(fd, function (err) {
            console.log(err);
        })
    });
});

七、創建目錄

const fs = require('fs');

//創建目錄,默認情況下不支持遞歸創建目錄
fs.mkdir('./a', function (err) {
    console.log(err);
});

//通過設置參數二中的recursive為true,則可以遞歸創建目錄
fs.mkdir('./a/b/c', {'recursive': true}, function (err) {
    console.log(err);
}); 

八、刪除目錄

const fs = require('fs');

//rmdir無法刪除非空目錄
fs.rmdir('./a', function (err) {
    console.log(err);
});

九、測試文件或目錄是否存在,是否可讀,是否可寫

const fs = require('fs');

let path = './a';

//判斷是否存在
fs.access(path, fs.constants.F_OK, function (err) {
    console.log(err ? '不存在' : '存在');
});

//判斷是否可讀
fs.access(path, fs.constants.R_OK, function (err) {
    console.log(err ? '不可讀' : '可讀');
});

//判斷是否可寫
fs.access(path, fs.constants.W_OK, function (err) {
    console.log(err ? '不可寫' : '可寫');
}); 

十、讀取目錄下的所有文件

const fs = require('fs');
const path = require('path');

//讀取目錄下所有文件
fs.readdir('./a', function (err, files) {
    console.log(files);
});

//遞歸的讀取一個目錄所有文件
function readDir(dir) {
    fs.stat(dir, function (err, stats) {
        if (stats.isDirectory()) {
            console.log(dir);
            fs.readdir(dir, function (err, files) {
                files.map(value => {
                    let cur = path.join(dir, value);
                    fs.stat(cur, function (err, stats) {
                        if (stats.isDirectory()) {
                            readDir(cur);
                        } else {
                            console.log(cur);
                        }
                    });
                });
            });
        } else {
            console.log(dir);
        }
    });
}
readDir('./node_modules');

十一、查看文件或目錄的詳細信息

const fs = require('fs');

//獲取目錄詳細信息
fs.stat('./a', function (err, stats) {
    console.log(stats);
});

//獲取文件詳細信息
fs.stat('./1.txt', function (err, stats) {
    console.log(stats);
});

stats.size 表示文件大小。

stats.atime 表示文件中的數據最后訪問時間。

stats.mtime 表示文件中的內容修改最后時間。

stats.ctime 表示文件權限,擁有者,所屬組,鏈接數發生改變時的時間。

stats.birthtime 表示文件創建時間。

十二、重命名或移動文件

const fs = require('fs');

//重命名文件
fs.rename('./1.txt', './b.txt', function (err) {
    console.log(err);
});

//移動文件
fs.rename('./2.txt', './a/b/c/2.txt', function (err) {
    console.log(err);
});

十三、刪除文件

const fs = require('fs');

//刪除文件
fs.unlink('./3.txt', function (err) {
    console.log(err);
});

十四、截取文件

const fs = require('fs');

//截取文件成3個字節
fs.truncate('./b.txt', 3, function (err) {
    console.log(err);
});

 十五、監視文件或目錄的狀態改變

const fs = require('fs');

//監視目錄
fs.watchFile('./a', function (curr, prev) {
    console.log(curr);
    console.log(prev);

    if (curr.mtimeMs !== prev.mtimeMs) {
        console.log('內容發生的改變');
    }
});

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM