node.js中fs文件系統(tǒng)模塊的使用方法實例詳解
本文實例講述了node.js中fs文件系統(tǒng)模塊的使用方法。分享給大家供大家參考,具體如下:
node.js中為我們提供了fs文件系統(tǒng)模塊,實現(xiàn)對文件或目錄的創(chuàng)建,修改和刪除等操作。
fs模塊中,所有的方法分為同步和異步兩種實現(xiàn)。
有 sync 后綴的方法為同步方法,沒有 sync 后綴的方法為異步方法。
一、文件的整個讀取
const fs = require('fs'); //參數(shù)一表示讀取的文件 //參數(shù)二表示讀取的配置,{encoding:'null', flag:'r'} //encoding 表示編碼方式 //flag 表示文件系統(tǒng)標志 //如果沒有指定參數(shù)二中的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); });
或同步讀?。?/p>
const fs = require('fs'); let data = fs.readFileSync('./1.txt'); console.log(data); let data2 = fs.readFileSync('./1.txt', {'encoding': 'utf8'}); console.log(data2);
二、往文件寫入數(shù)據(jù)
const fs = require('fs'); //參數(shù)一表示需要寫入的文件 //參數(shù)二表示寫入的數(shù)據(jù) //參數(shù)三表示寫入配置 {encoding:'utf8', mode:'0o666', flag:'w'} //encoding 表示文件編碼 //mode 表示文件權限 //flag 表示表示文件系統(tǒng)標志 fs.writeFile('./1.txt', '數(shù)據(jù)', {'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() 默認會以覆蓋的方式寫入數(shù)據(jù)。
或者同步寫入數(shù)據(jù):
const fs = require('fs'); fs.writeFileSync('./1.txt', '數(shù)據(jù)');
關于 mode 文件權限的說明:
在linux中文件的權限會為3種,4-表示可讀,2-表示可寫,1-表示可執(zhí)行。它們之間的相互組合形成不同權限。
對于文件,有三個權限分配,1:文件所有者,2:文件所屬組,3:其他用戶。
關于 flag 文件系統(tǒng)標志的說明:
r | 表示 讀取 |
w | 表示 寫入 |
s | 表示 同步 |
a | 表示 追加 |
x | 表示 文件存在就報錯 |
+ | 表示 增加相反操作 |
r+ 與 w+ 區(qū)別,文件不存在時,r+ 不會創(chuàng)建文件,而 w+ 會創(chuàng)建。如果文件存在 r+ 不會清空文件,而 w+ 會清空文件。
三、往文件中追加數(shù)據(jù)
const fs = require('fs'); fs.appendFile('./1.txt', '數(shù)據(jù)', function (err) { console.log(err); }); fs.appendFileSync('./1.txt', '同步追加');
四、拷貝文件
const fs = require('fs'); //參數(shù)一表示源文件 //參數(shù)二表示目標文件 //參數(shù)三表示拷貝操作的修飾符,默認0 //參數(shù)四表示回調函數(shù) fs.copyFile('./1.txt', './2.txt', function (err) { console.log(err); }); //同步拷貝文件 fs.copyFileSync('./1.txt', './3.txt');
五、打開文件,讀取文件,寫入文件
const fs = require('fs'); //參數(shù)一表示文件路徑 //參數(shù)二表示文件系統(tǒng)標志 //參數(shù)三表示文件權限 //參數(shù)四表示回調函數(shù),err表示錯誤,fd表示文件描述符,是一個整型 fs.open('./1.txt', 'r+', 0o666, function (err, fd) { //創(chuàng)建一個3字節(jié)的Buffer,用來接收數(shù)據(jù) let rbuf = Buffer.alloc(3); //參數(shù)一表示文件描述符 //參數(shù)二表示接收數(shù)據(jù)的Buffer //參數(shù)三表示往Buffer中寫入的偏移量 //參數(shù)四表示讀取的字節(jié)數(shù) //參數(shù)五表示從文件中讀取的位置,如果為null,則是文件的當前位置讀取 //參數(shù)六表示回調函數(shù),err表示錯誤,bytesRead表示實際讀取的字節(jié),buffer表示接收數(shù)據(jù)的Buffer fs.read(fd, rbuf, 0, 3, 0, function (err, bytesRead, buffer) { console.log(rbuf.toString()); console.log(bytesRead); }); let wbuf = Buffer.from('中國'); //參數(shù)一表示文件描述符 //參數(shù)二表示寫入數(shù)據(jù)的Buffer //參數(shù)三表示往Buffer中讀取的偏移量 //參數(shù)四表示寫入的字節(jié)數(shù) //參數(shù)五表示從文件中寫入的位置,如果不等于數(shù)字,則從文件的當前位置寫入 //參數(shù)六表示回調函數(shù),err表示錯誤,written表示實際寫入的字節(jié)數(shù),buffer表示寫入數(shù)據(jù)的Buffer fs.write(fd, wbuf, 0, 3, fs.stat, function (err, written, buffer) { console.log(written); }); });
六、同步磁盤緩存,把緩沖區(qū)數(shù)據(jù)刷新到文件中。
const fs = require('fs'); fs.open('./1.txt', 'w+', 0o666, function (err, fd) { let data = Buffer.from('數(shù)據(jù)\n'); let task = []; //我們往文件中循環(huán)寫入數(shù)據(jù) 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); }); //當們寫完數(shù)據(jù)后,一般會強制刷新緩沖區(qū),讓數(shù)據(jù)寫入到文件里,然后關閉文件。 //因為系統(tǒng)為了效率,我們寫入的數(shù)據(jù)通常會放到一個緩沖區(qū)中,當緩沖區(qū)滿了后,系統(tǒng)就一次把數(shù)據(jù)寫到文件。 fs.fsync(fd, function (err) { console.log(err); //關閉文件 fs.close(fd, function (err) { console.log(err); }) }); });
七、創(chuàng)建目錄
const fs = require('fs'); //創(chuàng)建目錄,默認情況下不支持遞歸創(chuàng)建目錄 fs.mkdir('./a', function (err) { console.log(err); }); //通過設置參數(shù)二中的recursive為true,則可以遞歸創(chuàng)建目錄 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 表示文件中的數(shù)據(jù)最后訪問時間。
- stats.mtime 表示文件中的內容修改最后時間。
- stats.ctime 表示文件權限,擁有者,所屬組,鏈接數(shù)發(fā)生改變時的時間。
- stats.birthtime 表示文件創(chuàng)建時間。
十二、重命名或移動文件
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個字節(jié) fs.truncate('./b.txt', 3, function (err) { console.log(err); });
十五、監(jiān)視文件或目錄的狀態(tài)改變
const fs = require('fs'); //監(jiān)視目錄 fs.watchFile('./a', function (curr, prev) { console.log(curr); console.log(prev); if (curr.mtimeMs !== prev.mtimeMs) { console.log('內容發(fā)生的改變'); } });
希望本文所述對大家node.js程序設計有所幫助。
相關文章
node.js中的querystring.escape方法使用說明
這篇文章主要介紹了node.js中的querystring.escape方法使用說明,本文介紹了querystring.escape的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12使用Node.js的readline模塊逐行讀取并解析大文件
在Node.js環(huán)境中處理大文件是一個常見的需求,尤其是在處理日志文件、數(shù)據(jù)庫導出、或任何形式的大規(guī)模文本數(shù)據(jù)時,本文將深入探討如何使用Node.js的readline模塊來實現(xiàn)這一功能,并討論相關的性能優(yōu)化和注意事項,需要的朋友可以參考下2024-09-09通過NodeJS輕松使用GRPC和協(xié)議緩沖區(qū)的方法
本文介紹了GRPC和協(xié)議緩沖區(qū)的基本概念,并展示了如何在NodeJS應用程序中使用它們,GRPC是一個高性能RPC框架,協(xié)議緩沖區(qū)則用于定義服務和序列化消息,本文給大家介紹如何在NodeJS應用程序中使用GRPC和協(xié)議緩沖區(qū),感興趣的朋友一起看看吧2024-10-10用Nodejs搭建服務器訪問html、css、JS等靜態(tài)資源文件
本篇文章主要介紹了用Nodejs搭建服務器訪問html、css、JS等靜態(tài)資源文件的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04