本篇文章給大家分享的是有關(guān)nodejs中哪個(gè)模塊提供文件操作api,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
10多年的浠水網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整浠水建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“浠水網(wǎng)站設(shè)計(jì)”,“浠水網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
在nodejs中,文件系統(tǒng)模塊提供文件操作api。文件系統(tǒng)模塊(簡(jiǎn)稱fs模塊)允許用戶訪問(wèn)計(jì)算機(jī)上的文件系統(tǒng)并與之交互;使用fs模塊可以實(shí)現(xiàn)文件及目錄的創(chuàng)建,寫(xiě)入、刪除等操作。
本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版,DELL G3電腦。
注意:讀取文件和寫(xiě)入文件可能理解很枯燥,但是我每次學(xué)習(xí)這樣的文章的時(shí)候都是為了下一篇文章做好準(zhǔn)備的,因?yàn)槲蚁乱黄恼碌膁emo需要使用到該方面的知識(shí),所以我就會(huì)把需要的理解的知識(shí)統(tǒng)統(tǒng)記錄一遍的。
在Node.js中,使用fs模塊來(lái)實(shí)現(xiàn)所有文件及目錄的創(chuàng)建,寫(xiě)入及刪除操作。
1、讀文件的方法:
在執(zhí)行讀文件操作時(shí),可以使用readFile方法與readFileSync方法讀取文件,有Sync等字樣的是同步方法,沒(méi)有這個(gè)字樣的是異步方法讀取,同步方法和異步方法的區(qū)別是:同步方法立即返回操作的結(jié)果,先看下相關(guān)的API:
1)readFileSync同步讀取文件API
使用方法讀取如下:
fs.readFileSync(filename, [options]);
filename參數(shù):用于指定讀取文件的完整文件路徑及文件名。
options參數(shù):該值為一個(gè)對(duì)象,它可以指定讀取文件時(shí)使用flag屬性指定該文件采取什么操作,默認(rèn)為 'r'; 可以指定值有如下:
'r': 讀取文件,如果文件不存在會(huì)拋出異常。
'r+': 讀取并寫(xiě)入文件,如果文件不存在會(huì)拋出異常。
'rs': 同步方式讀取文件并且通知操作系統(tǒng)忽略本地文件系統(tǒng)的緩存,如果文件不存在會(huì)拋出異常。
'w': 寫(xiě)入文件,如果文件不存在則創(chuàng)建該文件,如果文件已存在則清空文件內(nèi)容。
'w+': 讀取并寫(xiě)入文件,其他功能和 'w'一樣。
'a': 追加寫(xiě)入文件,如果文件不存在則創(chuàng)建該文件。
'a+': 讀取并追加寫(xiě)入文件,文件不存在就創(chuàng)建文件。
在options參數(shù)中,我們可以使用 encoding屬性指定使用何種編碼格式來(lái)讀取該文件,屬性值有 'utf-8', 'ascii', 'base64', 下面先看看簡(jiǎn)單的demo。如下所示:
先看下目錄結(jié)構(gòu)如下:
### 目錄結(jié)構(gòu)如下: demo1 # 工程名 | |--- readFile # 讀取文件的文件夾 | | |-- index.html # html文件 | | |-- index.js # js文件 | | |-- package.json | | |-- node_modules
如下代碼讀取文件代碼:
const fs = require('fs'); try { const data = fs.readFileSync('./index.html', 'utf-8'); // 等待操作結(jié)果返回,然后打印結(jié)果 console.log(data); } catch(e) { console.log('讀取文件發(fā)生錯(cuò)誤'); }
在命令行中執(zhí)行 node index.js 然后打印結(jié)果如下:
2) 異步讀取文件的API使用方法如下:
fs.readFile(filename, [options], callback);
filename 和 options 和 同步方法的參數(shù)是一樣的。
callback參數(shù) 是用于文件讀取完后執(zhí)行的回調(diào)函數(shù)。如下代碼所示:
const fs = require('fs'); fs.readFile('./index.html', 'utf-8', (err, data) => { if (err) { console.log('讀取文件時(shí)發(fā)生錯(cuò)誤'); } else { console.log(data); } });
執(zhí)行的結(jié)果和上面是一樣的。這里就不截圖了。
寫(xiě)入文件,我們使用fs模塊中的 writeFile 方法 或 wirteFileSync方法。writeFile使用方法如下(wirteFileSync方法類似,無(wú)非沒(méi)有callback參數(shù)):
fs.writeFile(filename, data, [options], callback);
filename參數(shù) 為指定需要被寫(xiě)入文件的完整路徑及文件名。
data參數(shù) 為指定需要寫(xiě)入的內(nèi)容,值可以是一個(gè)字符串或一個(gè)Buffer對(duì)象,該字符串或緩沖區(qū)中的內(nèi)容將被完整地寫(xiě)入到文件中。
options值為一個(gè)對(duì)象(可選),選項(xiàng)名為flag,它有如下選項(xiàng)值:
'flag': 用于指定該文件采取何種操作,默認(rèn)值為 'w', 含義是寫(xiě)入文件。該指定項(xiàng)所有值和上面readFile的值是一樣的。
(文件不存在就創(chuàng)建該文件,文件存在時(shí)重寫(xiě)該文件)。
'mode': 該屬性用于指定當(dāng)文件被打開(kāi)時(shí)對(duì)該文件的讀寫(xiě)權(quán)限。默認(rèn)值為 0666(可讀寫(xiě))。還有很多值自己可以百度了解下。
'encoding': 用于指定使用何種編碼格式來(lái)寫(xiě)入該文件。可指定屬性值為 'utf8'、'ascii'、'base64'。
callback: 該參數(shù)用于文件讀取完畢時(shí)執(zhí)行的回調(diào)函數(shù)。
下面我們簡(jiǎn)單的做一個(gè)demo,在我們目錄下的 index.js 文件中編寫(xiě)代碼,在該目錄下創(chuàng)建一個(gè) message.txt文件并寫(xiě)入兩行文字。如下代碼:
const fs = require('fs'); const str = '這是第一行。\r\n這是第二行'; fs.writeFile('./message.txt', str, (err) => { if (err) { console.log('寫(xiě)入文件操作失敗'); } else { console.log('寫(xiě)入文件操作成功'); } });
如下圖執(zhí)行命令:
在目錄下會(huì)生成 message.txt文件,如下圖
然后我們打開(kāi)文件,會(huì)看到其寫(xiě)入的內(nèi)容。
2)寫(xiě)入buffer對(duì)象,如下代碼:
const fs = require('fs'); const str = new Buffer('我喜愛(ài)編程'); fs.writeFile('./message.txt', str, (err) => { if (err) { console.log('寫(xiě)入文件操作失敗'); } else { console.log('寫(xiě)入文件操作成功'); } });
在message.txt中可以看到 '我喜愛(ài)編程' 幾個(gè)字。
3)設(shè)置options參數(shù)flag屬性選項(xiàng),比如追加數(shù)據(jù)這些,如下代碼:
const fs = require('fs'); const options = { flag: 'a'}; fs.writeFile('./message.txt', '這是追加的數(shù)據(jù)', options, (err) => { if (err) { console.log('寫(xiě)入文件操作失敗'); } else { console.log('寫(xiě)入文件操作成功'); } });
message.txt內(nèi)容編程如下了:我喜愛(ài)編程這是追加的數(shù)據(jù)
4)復(fù)制圖片文件
我們可以通過(guò)readFile方法讀取應(yīng)用程序?qū)?yīng)目錄下的一個(gè)圖片文件,在讀取文件時(shí)使用base64編碼,在該回調(diào)函數(shù)中使用writeFile方法,在該方法中使用base64編碼將讀取到的圖片文件數(shù)據(jù)復(fù)制到另一個(gè)圖片文件中。如下代碼:
const fs = require('fs'); fs.readFile('./images/1.png', 'base64', (err, data) => { fs.writeFile('./images/xx.png', data.toString(), 'base64', (err) => { if (err) { console.log('寫(xiě)文件操作失敗'); } else { console.log('寫(xiě)文件操作成功'); } }); });
在image下有一個(gè) 1.png, 它會(huì)先復(fù)制,然后寫(xiě)入 xx.png中(該文件之前不存在的,會(huì)創(chuàng)建該圖片文件)。
3.1)打開(kāi)文件open方法或openSync方法
要實(shí)現(xiàn)在文件中的指定位置處讀入內(nèi)容,首先我們需要打開(kāi)該文件,fs模塊中的open方法或openSync方法打開(kāi)文件。open方法使用方式如下所示:
fs.open(filename, flags, [mode], callback);
前三個(gè)參數(shù)和readFile的參數(shù)是一個(gè)意思的。最后一個(gè)參數(shù)是執(zhí)行完成后的回調(diào)函數(shù)。該回調(diào)函數(shù)有兩個(gè)參數(shù),第一個(gè)是打開(kāi)文件失敗時(shí)的錯(cuò)誤對(duì)象,第二個(gè)參數(shù)為一個(gè)整數(shù)值,代表打開(kāi)文件時(shí)返回的文件描述符。
下面我們來(lái)打開(kāi)我們剛剛創(chuàng)建的 message.txt文件,如下代碼:
const fs = require('fs'); fs.open('./message.txt', 'r', (err, fd) => { console.log(fd); });
執(zhí)行結(jié)果如下所示:
3.2)從指定的位置讀取文件
如上面打開(kāi)文件之后,我們可以在其回調(diào)函數(shù)使用fs模塊中的read方法或readSync方法從文件的指定位置處讀取文件,也可以使用fs模塊中的write方法或writeSync方法從文件中指定處寫(xiě)入數(shù)據(jù)。
fs.read(fd, buffer, offset, length, position, callback);
fd參數(shù)是 上面open打開(kāi)文件返回的文件描述符。
buffer參數(shù) 是一個(gè)buffer對(duì)象,用于指定將文件數(shù)據(jù)讀取到那個(gè)緩存區(qū)中。
offset:用于指定向緩沖區(qū)中寫(xiě)入數(shù)據(jù)的開(kāi)始位置。
length:用于指定從文件中讀取的字節(jié)數(shù)。
position: 用于指定讀取文件時(shí)的開(kāi)始位置。
callback:用于指定文件操作完畢時(shí)的回調(diào)函數(shù)。如下所示:
function(err, bytesRead, buffer) {}
err: 為操作失敗時(shí)的錯(cuò)誤對(duì)象。
bytesRead: 代表實(shí)際讀取的字節(jié)數(shù)。
buffer:為被讀取的緩沖區(qū)對(duì)象。
下面我們來(lái)看個(gè)demo代碼如下:
const fs = require('fs'); // message.txt 內(nèi)容為:我喜愛(ài)編程這是追加的數(shù)據(jù) fs.open('./message.txt', 'r', (err, fd) => { const buf = new Buffer(255); // 一個(gè)漢字的utf編碼為三個(gè)字節(jié)數(shù)據(jù) fs.read(fd, buf, 0, 9, 3, (err, bytesRead, buffer) => { console.log(buffer.slice(0, bytesRead).toString()); // 喜愛(ài)編 }); });
如上代碼message.txt內(nèi)容為:我喜愛(ài)編程這是追加的數(shù)據(jù),position為3,從第三個(gè)字節(jié)開(kāi)始讀取文件,然后長(zhǎng)度為9個(gè)字節(jié),一個(gè)漢字3個(gè)字節(jié),因此結(jié)果為 '喜愛(ài)編';
在文件被打開(kāi)后,可以使用fs模塊中的write方法或writeSync方法從一個(gè)緩存區(qū)中讀取數(shù)據(jù)并從文件的指定位置處寫(xiě)入這些數(shù)據(jù)。使用方法如下所示:
fs.write(fd, buffer, offset, length, position, callback);
fd參數(shù)為描述符。
buffer參數(shù)為一個(gè)Buffer對(duì)象,用于指定從哪個(gè)緩存區(qū)中讀取數(shù)據(jù)。
offset參數(shù)用于指定從緩存區(qū)中讀取數(shù)據(jù)時(shí)的開(kāi)始讀取位置。
length參數(shù)用于指定從緩存區(qū)中讀取的字節(jié)數(shù)。
position參數(shù)值用于指定寫(xiě)入文件時(shí)的開(kāi)始位置。
callback參數(shù)用于指定文件寫(xiě)入操作執(zhí)行完畢時(shí)的回調(diào)函數(shù)。該回調(diào)函數(shù)如下:
function(err, written, buffer) {}
err參數(shù)為寫(xiě)入失敗時(shí)的錯(cuò)誤對(duì)象。
written: 代表被寫(xiě)入的字節(jié)數(shù)。
buffer: 代表被讀取的緩沖區(qū)對(duì)象。
下面是一個(gè)簡(jiǎn)單的demo,如下所示:
const fs = require('fs'); const buf = new Buffer('我喜愛(ài)編程'); fs.open('./message.txt', 'w', (err, fd) => { fs.write(fd, buf, 3, 9, 0, (err, written, buffer) => { if (err) { console.log('寫(xiě)文件操作失敗'); } else { console.log('寫(xiě)文件操作成功'); } }); });
在message.txt中顯示為 喜愛(ài)編 這三個(gè)字。
5.1) 創(chuàng)建目錄mkdir和mkdirSync方法
在fs模塊中,可以使用mkdir方法創(chuàng)建目錄,該方法使用方式如下所示:
fs.mkdir(path, [mode], callback);
path參數(shù)用于指定需要被創(chuàng)建的目錄完整路徑及目錄名。
mode參數(shù)用于指定該目錄的權(quán)限,默認(rèn)值為0777(表示任何人可讀寫(xiě)該目錄)。
callback是回調(diào)函數(shù)。
下面是一個(gè)簡(jiǎn)單的demo,如下所示:
const fs = require('fs'); fs.mkdir('./test', (err) => { if (err) { console.log('創(chuàng)建目錄操作失敗'); } else { console.log('創(chuàng)建目錄操作成功'); } });
如下所示:
5.2)讀取目錄readdir和readdirSync方法
在fs模塊中,使用readdir方法讀取目錄,該方法使用如下所示
fs.readdir(path, callback);
path參數(shù)用于指定需要被讀取的目錄的完整路徑及目錄名。
callback參數(shù)用于指定讀取目錄操作的回調(diào)函數(shù)。該回調(diào)函數(shù)如下所示:
function(err, file) {}
err 為讀取目錄操作失敗的回調(diào)函數(shù)。
file參數(shù)值為一個(gè)數(shù)組,讀取到的文件中的所有文件名。
如下demo所示:
const fs = require('fs'); fs.readdir('./', (err, files) => { if (err) { console.log('讀取目錄操作失敗'); } else { console.log(files); } });
如下圖所示:
6.1)查看文件或目錄的信息
在fs模塊中,可以使用stat方法或lstat方法查看一個(gè)文件或目錄的信息。這兩個(gè)方法唯一的區(qū)別是當(dāng)查看符號(hào)鏈接文件的信息
時(shí),必須使用lstat方法。使用方法如下所示:
fs.stat(path, callback); fs.lstat(path, callback);
path參數(shù)用于被查看的文件或目錄的完整路徑及文件名或目錄名。
callback是回調(diào)函數(shù)。如下回調(diào)函數(shù)
function(err, stats) {}
err 參數(shù)值為查看文件或目錄信息操作失敗時(shí)觸發(fā)的錯(cuò)誤對(duì)象。
stats參數(shù)值為一個(gè) fs.Stats對(duì)象,該對(duì)象有如下一些方法,在這些方法中不包含任何參數(shù)。
isFile: 用于判斷被查看的對(duì)象是否為一個(gè)文件,如果是則返回true,否則的話返回false。
isDirectory: 用于判斷被查看的對(duì)象是否為一個(gè)目錄,如果是的話返回true,否則的話返回false。
還有很多很多其他的方法,這里不一一介紹,用的比較少,有需要的話,可以自己百度一下看看。
下面是使用 stat的使用demo,查看應(yīng)用程序根目錄下的 message.txt文件并且在回調(diào)函數(shù)中的第二個(gè)參數(shù)值 fs.Stats對(duì)象在控制臺(tái)中的輸出有哪些?
const fs = require('fs'); fs.stat('./message.txt', (err, stats) => { console.log(stats); });
如下圖所示顯示:
6.2)檢查文件或目錄是否存在exists和existsSync方法
在fs模塊中,可以使用exists方法檢查一個(gè)文件或目錄是否存在,該方法使用方式如下所示:
fs.exists(path, callback);
path參數(shù):用于指定需要被檢查的文件或目錄的完整路徑。
callback: 是回調(diào)函數(shù),該回調(diào)函數(shù)如下所示:
function(exists) {}
exists參數(shù),當(dāng)文件或目錄存在時(shí),該參數(shù)值為true,否則的話,該參數(shù)值為false。
下面是一個(gè)簡(jiǎn)單的demo,如下代碼所示:
const fs = require('fs'); // 該目錄是存在的 fs.exists('./message.txt', (exists) => { console.log(exists); // true }); // 該目錄是不存在的 fs.exists('./message2.txt', (exists) => { console.log(exists); // false });
6.3) 獲取文件或目錄的絕對(duì)路徑realpath和realpathSync方法
在fs模塊中,可以使用 realpath方法獲取一個(gè)文件或目錄的絕對(duì)路徑,該方法使用如下所示:
fs.realpath(path, [cache], callback);
cache 參數(shù)是可選的,path和callback是必須的。
path參數(shù)為需要查看的文件或目錄的完整路徑。
cache參數(shù)為一個(gè)對(duì)象,其中存放了一些預(yù)先指定的路徑。具體的百度下,這個(gè)參數(shù)用的不多。
callback是回調(diào)函數(shù),該回調(diào)函數(shù)有2個(gè)參數(shù),err參數(shù)值為獲取目錄的絕對(duì)路徑失敗的錯(cuò)誤對(duì)象。resolvedPath參數(shù)值為獲取
到的文件或目錄的絕對(duì)路徑。
下面是一個(gè)簡(jiǎn)單的demo,如下所示:
const fs = require('fs'); fs.realpath('./message.txt', (err, resolvedPath) => { if (err) { throw err; } else { console.log(resolvedPath); } });
執(zhí)行如下所示:
6.4) 使用ReadStream對(duì)象讀取文件
在fs模塊中,可以使用createReadStream方法創(chuàng)建一個(gè)將文件內(nèi)容讀取為流數(shù)據(jù)的ReadStream對(duì)象,該方法使用如下所示:
fs.createReadStream(path, [options]);
path 該參數(shù)用于指定需要被讀取的文件的完整路徑及文件名。
options為一個(gè)對(duì)象,它有如下屬性:
flags: 用于指定對(duì)該文件采取什么操作,默認(rèn)值為 'r', 它的用法和readFile方法中的flags屬性一樣的。
encoding: 指定使用什么編碼來(lái)讀取該文件,可指定的值有 'utf8', 'ascii', 'base64'. 默認(rèn)值為null.
start: 指定文件的開(kāi)始讀取位置。
end: 指定文件的結(jié)束讀取位置。
還有很多其他的參數(shù),這里不一一講解,可以自行百度下即可。
下面簡(jiǎn)單的使用一個(gè)demo來(lái)了解下使用:如下代碼:
const fs = require('fs');/* 一個(gè)漢字三個(gè)字節(jié),message.txt的內(nèi)容為:我喜愛(ài)編寫(xiě)代碼 因此從第三個(gè)位置開(kāi)始,到第十二個(gè)位置結(jié)束,因此數(shù)據(jù)應(yīng)該為 喜愛(ài)編寫(xiě)*/const options = { start: 3, end: 12}; const file = fs.createReadStream('./message.txt', options); file.on('open', (fd) => { console.log('開(kāi)始讀取文件'); }); file.on('data', (data) => { console.log('讀取到的數(shù)據(jù):' + data); }); file.on('end', () => { console.log('文件已全部讀取完畢'); }); file.on('close', () => { console.log('文件被關(guān)閉'); }); file.on('error', (err) => { console.log('讀取文件失敗'); });
如下圖所示:
我們可以使用 ReadStream對(duì)象的pause方法暫停data事件的觸發(fā),同時(shí)也意味著停止文件的讀取操作。而已經(jīng)被讀取到的操作系統(tǒng)緩存區(qū)中的數(shù)據(jù)也將被暫時(shí)保存在操作系統(tǒng)緩沖區(qū)中,在使用了pause方法暫停data事件的觸發(fā)之后,也可以使用ReadStream對(duì)象的resume方法恢復(fù)data事件的觸發(fā),也就意味著可以繼續(xù)讀取文件的數(shù)據(jù)。
如下demo:
const fs = require('fs'); const readStream = fs.createReadStream('./message.txt'); readStream.pause(); readStream.on('data', (data) => { console.log('獲取到的數(shù)據(jù)為:' +data); }); setTimeout(() => { readStream.resume(); }, 1000);
讀取過(guò)程中,斷聽(tīng)了一秒后,繼續(xù)把數(shù)據(jù)讀出來(lái)了。
注意:寫(xiě)入文件的方法是 WriteStream, 使用方式和讀方式類似,這里不多介紹。
以上就是nodejs中哪個(gè)模塊提供文件操作api,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱:nodejs中哪個(gè)模塊提供文件操作api
文章轉(zhuǎn)載:http://www.chinadenli.net/article38/jcodpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、域名注冊(cè)、網(wǎng)站設(shè)計(jì)、App開(kāi)發(fā)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)