您好,登錄后才能下訂單哦!
這篇文章主要介紹“nodejs的哪個模塊能操作文件”,在日常操作中,相信很多人在nodejs的哪個模塊能操作文件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nodejs的哪個模塊能操作文件”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
nodejs的“文件系統(tǒng)”模塊可以操作文件。fs(文件系統(tǒng))模塊是nodejs提供的用于訪問本地文件系統(tǒng)的功能模塊,使用fs模塊可以實現(xiàn)文件及目錄的創(chuàng)建,寫入、刪除等操作。
本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版、Dell G3電腦。
fs(file system)
模塊是nodejs提供的用于訪問本地文件系統(tǒng)的功能模塊,它使得運行于nodejs環(huán)境下的JavaScript具備直接讀寫本地文件的能力。
fs模塊是nodejs的核心模塊之一,只要安裝了nodejs,就可以直接使用,不需要單獨安裝。引入fs模塊非常簡單:
let fs = require('fs');
接下來就可以調(diào)用fs模塊的相關(guān)接口直接讀寫文件系統(tǒng)。
fs模塊主要提供了以下的接口類:
fs.Dir
,目錄類??衫斫鉃槲募A。
fs.Dirent
,目錄項類。通過Dir
類的返回值獲得,表示該目錄下的一個子項,可能是文件或子目錄。
fs.FSWatcher
,文件監(jiān)聽類,它可以為一個文件創(chuàng)建一個監(jiān)聽器,當(dāng)文件變化時觸發(fā)回調(diào)。
fs.StatWatcher
,調(diào)用fs.watchFile()方法之后的返回值類型,主要用于協(xié)助控制事件循環(huán)。
fs.ReadStream
,讀取流。當(dāng)流式讀取文件時需要使用該類。
fs.Stats
,文件元信息類。通過該類可以獲取文件相關(guān)信息(如文件類型、文件大小、文件描述符等)。
fs.WriteStream
,寫入流。當(dāng)流式寫入數(shù)據(jù)時需要使用。
除了以上的類,fs模塊還提供了非常多的實例方法,它們可以直接通過fs調(diào)用,如讀取文件的方法reafFile
:
let fs = require('fs'); fs.readFile('./README.md', function(err, data) = { if (err) throw err; ... // 處理數(shù)據(jù) })
該函數(shù)以異步的方式讀取文件,以可能拋出的異常作為回調(diào)函數(shù)的第一個參數(shù)(這樣設(shè)計的目的是“強制”或者“提醒”開發(fā)者去處理可能出現(xiàn)的異常),而真正的文檔數(shù)據(jù)則作為第二個參數(shù)。
fs模塊中幾乎所有默認(rèn)的讀寫函數(shù)都是異步的,不過它也同時提供了這些函數(shù)的同步版本,一般是在函數(shù)后面加Sync
。如上面的代碼還可以用readFileSync
改寫:
let fs = require('fs'); try { let data = fs.readFileSync('./README.md', 'utf8'); } catch(e = { console.error(e); })
大多數(shù)情況下,nodejs推薦使用異步版本的讀寫函數(shù)來提升系統(tǒng)性能。而如果要使用同步版本的函數(shù),應(yīng)該盡可能使用try catch
捕獲異常,以防止讀寫失敗造成主線程崩潰。
既然是文件系統(tǒng)模塊,就必然要根據(jù)文件路徑找到需要操作的文件。fs模塊支持的路徑類型分為三類:字符串、Buffer和URL對象。
字符串類是最常用的路徑類型,包括絕對路徑和相對路徑。絕對路徑指的是相對于文件系統(tǒng)根目錄的路徑,而相對路徑是相對于當(dāng)前工作目錄的路徑(即運行node命令時所在的目錄,可以通過process.cwd()
獲取到)。
當(dāng)使用絕對路徑時,windows和其他操作系統(tǒng)存在一定差異。因為在其他大多數(shù)操作系統(tǒng)中,驅(qū)動器只有唯一的根目錄;而在windows上,則存在多個獨立的驅(qū)動盤(如C盤、D盤等)。從寫法上來看,絕對路徑一般是以/
開頭,表示驅(qū)動盤的根目錄:
fs.readFile('/README.md', (err, data) => { ... });
而在windows上,則是以驅(qū)動盤開頭的:
fs.readFile('d://nodejs/README.md', (err, data) => { ... })
我們知道,一般windows都是使用反斜線\
作為路徑分隔符的。不過在nodejs中作了兼容,使用斜線或者反斜線都可以正確識別,因此下面的寫法也是正確的:
fs.readFile('d:\\nodejs\README.md', (err, data) => { ... })
需要注意的是,當(dāng)使用fs.readdir('c:')
讀取C盤目錄時,實際上讀取的是c:\\user\xxx
這個用戶根目錄,必須加雙斜線或雙反斜線,才可以讀取到真正的c盤根目錄:fs.readdir('c://')
。
而相對路徑則是相對于當(dāng)前工作目錄的路徑,通常以../
(回退到上級目錄)、./
(當(dāng)前目錄)或當(dāng)前路徑下的某個目錄項開頭。如:
// 當(dāng)前目錄的上一級目錄下的README.md文件 fs.readFileSync('../README.md'); // 當(dāng)前目錄下nodejs文件夾內(nèi)的README.md fs.readFileSync('./nodejs/README.md'); fs.readFileSync('nodejs/README.md');
./
開頭表示當(dāng)前目錄,可以直接省略。
Buffer類型的路徑和字符串幾乎沒有差別,只是某些操作系統(tǒng)將文件路徑視為二進制字節(jié)序列,因此通常需要用Buffer.from('README.md')
的方式將字符串路徑轉(zhuǎn)化為二進制字節(jié)序列。由于這類操作系統(tǒng)比較少用,這里不再詳細(xì)介紹。
URL(uniform resource locator,統(tǒng)一資源定位器)是一種通用的資源定位方案,它將任意資源(包括本地文件)都視為網(wǎng)絡(luò)資源,然后以一種統(tǒng)一的方式定位它們。
fs模塊僅支持使用file
協(xié)議的URL對象,該協(xié)議的前綴為file:///
,路徑格式如下:
// 在windows下,定位某個主機上的文件, // 一般用于讀寫局域網(wǎng)內(nèi)的共享文件夾 fs.readFileSync(new URL('file:///主機名/README.md')); // 定位本地資源 fs.readFileSync(new URL('file:///c:/README.md'));
以上兩種寫法都是針對windows平臺的,第一種主要用于局域網(wǎng)內(nèi)的共享文件讀取,第二種用于讀寫本地文件。
對于其他平臺,url的格式如下:
fs.readFileSync(new URL('file:///nodejs/README.md'));
它會被轉(zhuǎn)化為絕對路徑:/nodejs/README.md
。URL類型的路徑不支持相對路徑。
鑒于fs模塊的接口數(shù)量較為龐大,這里暫不一一探討,如果感興趣,請參考 nodejs中文網(wǎng) - fs模塊。本文主要是介紹以下幾個接口類中較為常用的一些api,基本上可以滿足大部分文件系統(tǒng)操作的需求:
fs.Dir
fs.Dirent
fs.ReadStream
fs.Stats
fs.WriteStream
這是fs模塊對目錄(或稱為文件夾)的抽象類。調(diào)用fs.opendir()
、fs.opendirSync()
或 fsPromises.opendir()
這三個方法時會返回一個Dir
類型的對象,用于操作打開后的目錄。
比如我們要遍歷當(dāng)前文件夾下的所有子目錄及文件,可以用下面的代碼(v12.12以上版本可用):
async function getChild (path) { // 讀取目錄子項,返回一個promise let dir = await fs.promises.opendir(path); for await (let dirent of dir) { console.log(dirent.name); }}
關(guān)閉目錄有三個方法:dir.close()
、dir.close(callback)
和dir.closeSync()
。
dir.close()
返回的是一個promise,向其注冊then方法可以在目錄關(guān)閉后執(zhí)行回調(diào)函數(shù),如dir.close().then((e) => { ... })
;dir.close(callback)
是關(guān)閉目錄的異步方法,直接傳入回調(diào)函數(shù),它會在文件關(guān)閉后調(diào)用;dir.closeSync()
是關(guān)閉目錄的同步方法,只有目錄成功關(guān)閉后才會執(zhí)行后續(xù)代碼。
dir.path
的值為當(dāng)前目錄的路徑,即調(diào)用opendir
方法時傳入的路徑。
讀取該目錄的目錄項的三個方法為:dir.read()
、dir.read(callback)
和dir.readSync()
。
dir.read()
返回的是一個promise數(shù)組或null,分別負(fù)責(zé)讀取每一個目錄項,主要用于async函數(shù)遍歷:
async function read (path) { let dir = await fs.promises.opendir(path); for await (let dirent of dir.read()){ ... }}
dir.read(callback)
則是讀取目錄項的異步版本,每次讀取到一個子項,就會調(diào)用一次callback;dir.readSync()
是讀取目錄項的同步版本,返回的是Dirent
類型的數(shù)組或null。
目錄項類。當(dāng)通過fs.opendir()
方法讀取一個目錄時,它的每一個子項就是一個Dirent
類對象,每個Dirent
對象可能是一個子目錄,或者是一個文件。每個Dirent
對象都是文件名和文件類型組成的。
fs.Dirent
提供的方法主要是用于判斷目錄項類型:
dirent.isBlockDevice()
,是否為塊設(shè)備。
dirent.isCharacterDevice()
,是否為字符設(shè)備。
dirent.isDirectory()
,是否為系統(tǒng)目錄。
dirent.isFIFO()
,是否為先入先出通道。
dirent.isFile()
,是否為普通文件。
dirent.isSocket()
,是否為套接字。
dirent.isSymbolicLink()
,是否為符號鏈接,即快捷方式。
另外,dirent.name
的值為目錄項的名字。
讀取流類,用于流式讀取文件。該類由fs.createReadStream()
創(chuàng)建并返回。
fs.ReadStream
支持三個事件:
close
,讀取流關(guān)閉事件。
open
,讀取流打開事件。
ready
,讀取流就緒事件,在open事件發(fā)生后立即觸發(fā)。
回調(diào)函數(shù)接收文件描述符fd
作為參數(shù),用于對文件的后續(xù)操作。
fs.ReadStream
實例有三個實例屬性:
readStream.bytesRead
,已讀取的字節(jié)數(shù)。
readStream.path
,文件路徑。
readStream.pending
,文件是否就緒(ready事件發(fā)生前,該值為true,發(fā)生后變?yōu)閒alse)。
提供對文件信息的描述。調(diào)用fs.stat()
、fs.lstat()
和fs.fstat()
會返回該類型的對象。
一個fs.Stats
實例包含以下屬性:
Stats { dev: 2114, // 設(shè)備的數(shù)字標(biāo)識符 ino: 48064969, // 設(shè)備的索引號 mode: 33188, // 文件類型和模式 nlink: 1, // 文件的硬鏈接數(shù) uid: 85, // 該文件擁有者的標(biāo)識符 gid: 100, // 擁有該文件的群組的標(biāo)識符 rdev: 0, // 數(shù)字型設(shè)備表標(biāo)識符 size: 527, // 文件大小,單位為字節(jié) blksize: 4096, // 文件系統(tǒng)塊的大小 blocks: 8, // 文件系統(tǒng)為當(dāng)前文件分配的塊數(shù) atimeMs: 1318289051000.1, // 上次被訪問時間 mtimeMs: 1318289051000.1, // 上次被修改的時間 ctimeMs: 1318289051000.1, // 上次更改文件狀態(tài)的時間 birthtimeMs: 1318289051000.1, // 文件的創(chuàng)建時間 atime: Mon, 10 Oct 2011 23:24:11 GMT, // 以上四個時間的另一種格式 mtime: Mon, 10 Oct 2011 23:24:11 GMT, ctime: Mon, 10 Oct 2011 23:24:11 GMT, birthtime: Mon, 10 Oct 2011 23:24:11 GMT }
每個Stats
對象還可以返回一個bigint
類型的結(jié)果,它的每個結(jié)果都是bigint
類型,而不是上面的number
類型,這里不再詳述。
同時,它還有與Dirent
相同的7個實例方法,來判斷當(dāng)前的設(shè)備類型,請參考上述Dirent
。
寫入流類,用于流式地寫入數(shù)據(jù)。它由fs.createWriteStream()
創(chuàng)建和返回。
與fs.ReadStream
類似,它也有close
、open
和ready
三個事件,兩者的用法也是一樣的。
每個WriteStream
實例也都有三個實例屬性:writeStream.bytesWritten
、writeStream.path
和writeStream.pending
,分別表示當(dāng)前已寫入的字節(jié)數(shù)、寫入流文件路徑和是否已就緒,與ReadStream
也是類似的。
fs模塊提供了很多讀寫文件系統(tǒng)資源的函數(shù),上一部分介紹的類主要是對這些函數(shù)操作結(jié)果的封裝。下面來介紹一些常用的方法:
檢查文件的可用性。
第一個參數(shù)path為文件路徑,可以是字符串、Buffer或URL類型;
第二個參數(shù)為要檢查的類型,可能的值包括fs.constants.F_OK
(是否存在,默認(rèn)值)、fs.constants.R_OK
(是否可讀)和fs.constants.W_OK
(是否可寫);
第三個參數(shù)為回調(diào)函數(shù),如果檢查失敗,則會傳入一個Error
對象,否則會傳入undefined。
比如我們需要檢查當(dāng)前文件夾下是否存在package.json
,可以這樣寫:
fs.access('package.json', fs.constants.F_OK, (err) => { if (err) { ... // 文件存在 } else { ... // 文件不存在 }})
一般來說,不應(yīng)該在檢查文件可用性之后立即讀寫文件,因為從檢查文件可用性到實際讀寫文件的過程中,該文件的狀態(tài)可能發(fā)生變化(比如其他進程操作了該文件),這會導(dǎo)致文件可用性檢查失效。因此fs.access
方法通常只用來檢查文件的可用性,而要讀寫文件的話,可以直接調(diào)用讀寫文件的方法,再根據(jù)回調(diào)函數(shù)接收到的可能的異常來判斷該文件是否可用。
該方法還有一個同步版本:fs.accessSync(path [,mode])
,前兩個參數(shù)與異步版本是一致的。當(dāng)文件檢查成功時,該方法返回undefined,否則將拋出異常,用法如下:
try { fs.accessSync('package.json', fs.constants.R_OK | fs.constants.W_OK); console.log('可以讀寫'); } catch (err) { console.error('無權(quán)訪問'); }
向文件中追加數(shù)據(jù)。
path
支持字符串、Buffer和URL類型;data
為要追加的數(shù)據(jù),可以是字符串或Buffer實例;options
為配置對象,包含三個參數(shù):
encoding,編碼方式,默認(rèn)為utf8
。
mode,模式,默認(rèn)為0o666
。該參數(shù)為文件的權(quán)限描述,0o666
表示為每個用戶擁有讀寫權(quán)限。
flag,文件操作方式,默認(rèn)為a
,即追加。
callback
為函數(shù)執(zhí)行完畢的回調(diào)函數(shù),如果追加失敗,則第一個參數(shù)為錯誤對象,否則為undefined。例子如下:
fs.appendFile('README.md', '這是要添加的數(shù)據(jù)', (err) => { if (err) { console.log('數(shù)據(jù)追加失敗'); } else { console.log('數(shù)據(jù)追加成功'); }})
該方法的同步版本為fs.appendFileSync(path, data[, options])
。與accessSync一樣,它也只是移除了最后一個參數(shù)callback,通過返回值來判斷操作結(jié)果,這里不再重復(fù)舉例。
修改文件的權(quán)限。
文件系統(tǒng)中每個文件都有讀、寫和執(zhí)行三個權(quán)限,用r、w和x表示。其中r的權(quán)重為4,w的權(quán)重為2,x的權(quán)重為1,即當(dāng)用戶擁有讀權(quán)限時,權(quán)限值加4,擁有寫權(quán)限時權(quán)限值加2,擁有執(zhí)行權(quán)限時權(quán)限值加1。
權(quán)限類型 | 權(quán)重 |
---|---|
讀權(quán)限 | 4 |
寫權(quán)限 | 2 |
執(zhí)行權(quán)限 | 1 |
這種權(quán)重分配使得任何一種權(quán)限擁有情況的權(quán)限值都是不同的,因此只需要一個八進制數(shù)字就可以表示某個用戶對某個文件擁有哪些權(quán)限。
比如某個用戶擁有對某個文件的讀寫權(quán)限,而沒有執(zhí)行權(quán)限,則他的權(quán)限值為4 + 2 + 0 = 6
。而如果同時擁有這三個權(quán)限,則權(quán)限值為4 + 2 + 1 = 7
。
對一個文件而言,系統(tǒng)中存在三類用戶:文件的擁有者、擁有該文件的用戶組和其他用戶。文件系統(tǒng)使用三個八進制數(shù)字,來表示這三類用戶對某個文件的權(quán)限。比如當(dāng)某個文件的權(quán)限值為0o761
時,它表示:
文件的擁有者具備讀、寫和執(zhí)行權(quán)限:7 = 4 + 2 + 1
文件所屬的用戶組成員具備讀寫權(quán)限:6 = 4 + 2 + 0
其他成員只具備執(zhí)行權(quán)限:1 = 0 + 0 + 1
fs.chmod
方法就是用來修改某個文件權(quán)限的。它可以傳入三個參數(shù),分別是文件路徑、權(quán)限值和回調(diào)函數(shù)。權(quán)限值就是上面所講的三個八進制數(shù)字,如0o761
;如果修改失敗,則回調(diào)函數(shù)接收異常對象,否則沒有參數(shù)。
該方法的同步版本為fs.chmodeSync(path, mode)
,用法與其他同步方法一致。
修改文件的擁有者。
第一個參數(shù)為文件路徑;第二個參數(shù)為新的文件擁有者的用戶標(biāo)識符;第三個參數(shù)為該文件所屬的用戶組的標(biāo)識符,最后一個參數(shù)為執(zhí)行完畢后的回調(diào)函數(shù)。
uid和gid都是number類型,是文件系統(tǒng)為每個用戶和用戶組分配的唯一id,callback則會在操作失敗時得到一個錯誤對象。
該方法的同步版本為fs.chownSync(path, uid, gid)
,使用方法與其他同步方法一致。
異步地關(guān)閉一個文件。
第一個參數(shù)fd
是調(diào)用fs.open
打開一個文件時,文件系統(tǒng)為該文件分配的一個數(shù)字類型的文件描述符;當(dāng)文件關(guān)閉失敗時,callback會得到一個異常對象。如:
fs.open('README.md', 'a', (err, fd) => { ... fs.close(fd, (err) => { if (err) {} // 關(guān)閉失敗 }); })
該方法的異步版本為fs.closeSync(fd)
。
fs模塊提供的常量,參見fs常量。
拷貝一個文件。
第一個參數(shù)src
為拷貝源的地址,數(shù)據(jù)類型與path一致;
第二個參數(shù)dest
為目標(biāo)地址,數(shù)據(jù)類型也與path一致;
第三個可選參數(shù)為拷貝參數(shù),默認(rèn)情況下,將創(chuàng)建或覆蓋(文件已存在時)目標(biāo)文件。除了這個默認(rèn)值,還有以下三個可選值:
fs.constants.COPYFILE_EXCL
- 如果 dest 已存在,則拷貝操作將失敗。
fs.constants.COPYFILE_FICLONE
- 拷貝操作將嘗試創(chuàng)建寫時拷貝(copy-on-write)鏈接。如果平臺不支持寫時拷貝,則使用后備的拷貝機制。
fs.constants.COPYFILE_FICLONE_FORCE
- 拷貝操作將嘗試創(chuàng)建寫時拷貝鏈接。如果平臺不支持寫時拷貝,則拷貝操作將失敗。
第四個參數(shù)為為執(zhí)行之后回調(diào)函數(shù),與其他異步函數(shù)一致,它也會在失敗時接收到一個異常對象。
它的同步版本為fs.copyFileSync(src, dest[, mode])
。
創(chuàng)建一個讀取流。常見用法為:
let fs = require('fs'); let rs = fs.createReadStream('./1.txt',{ highWaterMark:3, //文件一次讀多少字節(jié),默認(rèn) 64*1024 flags:'r', //默認(rèn) 'r' autoClose:true, //默認(rèn)讀取完畢后自動關(guān)閉 start:0, //讀取文件開始位置 end:3, //流是閉合區(qū)間 包含start也含end encoding:'utf8' //默認(rèn)null }); rs.on("open",()=>{ console.log("文件打開") }); // 自動觸發(fā)data事件 直到讀取完畢 rs.on('data',(data)=>{ console.log(data); });
創(chuàng)建一個寫入流。常見用法為:
const fs=require('fs'); const path=require('path'); let writeStream=fs.createWriteStream('./test/b.js',{encoding:'utf8'}); //讀取文件發(fā)生錯誤事件 writeStream.on('error', (err) => { console.log('發(fā)生異常:', err); }); //已打開要寫入的文件事件 writeStream.on('open', (fd) => { console.log('文件已打開:', fd); }); //文件寫入完成事件 writeStream.on('finish', () => { console.log('寫入已完成..'); console.log('讀取文件內(nèi)容:', fs.readFileSync('./test/b.js', 'utf8')); //打印寫入的內(nèi)容 console.log(writeStream); }); //文件關(guān)閉事件 writeStream.on('close', () => { console.log('文件已關(guān)閉!'); }); writeStream.write('這是我要做的測試內(nèi)容'); writeStream.end();
如fs.fchown(fd, callback)
、fs.fchmod(fd, callbakc)
等,它是將第一個參數(shù)從path替換為了文件對應(yīng)的文件描述符,使用這類方法之前需要先通過fs.open`打開文件,獲取文件描述符。這里不再詳述。
創(chuàng)建一個目錄(即文件夾)。
第一個參數(shù)path為要創(chuàng)建文件夾的路徑;
第二個參數(shù)options支持兩個參數(shù):
recursive
,是否遞歸創(chuàng)建父目錄,默認(rèn)為false。
mode
,創(chuàng)建的文件夾的權(quán)限,默認(rèn)是0o777。
第三個參數(shù)為執(zhí)行完畢的回調(diào)函數(shù),它的第一個參數(shù)為可能的異常對象,當(dāng)recursive
為true
時,它還會得到一個path參數(shù),值為當(dāng)前操作創(chuàng)建的第一個目錄。
而當(dāng)要創(chuàng)建的目錄已經(jīng)存在時,如果recursive
為false,則會拋出異常,否則不會執(zhí)行任何操作。
創(chuàng)建目錄的用法如下:
fs.mkdir('nodejs/lib', {recursive: true}, (err, path) => { ...})
該代碼試圖在當(dāng)前路徑下的nodejs文件夾內(nèi)創(chuàng)建lib文件夾,并且要遞歸地創(chuàng)建父目錄。即假如當(dāng)前目錄下沒有nodejs文件夾,則先創(chuàng)建它。創(chuàng)建完成后,如果nodejs文件夾是新創(chuàng)建的,則path就是它的路徑;如果nodejs已經(jīng)存在了,則path是新創(chuàng)建的lib文件夾的路徑。
該方法的同步版本為fs.mkdirSync(path[, options])
。
打開一個文件。
第一個參數(shù)為要打開的文件的路徑;
第二個參數(shù)為打開方式,如r(只讀),w(只寫),a(追加)等;
第三個參數(shù)為文件權(quán)限,默認(rèn)為0o666(讀寫權(quán)限);
最后一個參數(shù)為回調(diào)函數(shù),它有兩個參數(shù),第一個為可能拋出的異常對象,第二個是文件系統(tǒng)為被打開的文件分配的數(shù)值類型的文件描述符fd
。
如:
fs.open('README.md', 'r', (err, fd) => { ... fs.close(fd, (err) => {})})
它的同步版本為fs.openSync(path[, flags[, mode]])
。
打開一個目錄。
第一個參數(shù)為目錄的路徑;
第二個參數(shù)包含兩個參數(shù):
encoding,編碼類型,默認(rèn)utf8
;
bufferSize,操作該目錄時要緩沖的目錄項的數(shù)量,默認(rèn)值32,值越大則性能越好,但內(nèi)存消耗會更大
第三個參數(shù)為callback,即打開目錄后的回調(diào)函數(shù)。該回調(diào)函數(shù)可接受兩個值,一個是可能的異常對象,另一個是打開的目錄對象,類型為fs.Dir
。
它的同步版本為fs.opendirSync(path[, options])
。
異步地讀取文件數(shù)據(jù)。
該方法會默認(rèn)先用fs.open
打開文件,并在讀取完畢后自動關(guān)閉文件。因此調(diào)用該方法不需要手動打開和關(guān)閉文件,不過如果需要頻繁地操作文件,則該方法會導(dǎo)致文件被反復(fù)打開和關(guān)閉,造成性能下降。
path除了可以是文件路徑外,還可以是文件描述符。如果傳入的是文件描述符,則默認(rèn)在讀取完畢后不會關(guān)閉文件,并且后續(xù)的讀取會接著上次讀取的位置繼續(xù)向后。
options支持以下兩個參數(shù):
encoding,編碼格式,默認(rèn)為null,實際使用時一般傳入'utf8'
flag,讀取方式,默認(rèn)為只讀r
如果只需要指定編碼格式,options還可以是一個字符串,如'utf8'
。
回調(diào)函數(shù)的第一個參數(shù)為可能的異常對象,第二個參數(shù)則是從文件中讀出的數(shù)據(jù),可能的數(shù)據(jù)類型為字符串或Buffer。如
fs.readFile('README.md', 'utf8', (err, data) => { if (err) { console.log('讀取失敗'); } else { console.log(data); }})
該方法的同步版本為fs.readFileSync(path[, options])
。
另外該方法還有一個可替代方法,fs.read
,請參考fs.read。它是在使用fs.open
打開文件時通用的讀取文件的方法,對讀取過程的控制粒度更細(xì)。在對同一個文件進行頻繁的讀取操作,一般使用該方法。
將oldPath指定的文件重命名為newPath指定的文件,如果該文件已存在,則覆蓋它。
回調(diào)函數(shù)只接收可能拋出的異常對象。
它的同步版本為fs.renameSync(oldPath, newPath)
。
獲取某個文件的詳細(xì)信息。
如
fs.stat('README.md', {bigint: true}, function(err, stats) { console.log(stats.isDirectory()); console.log(stats); });
options僅支持bigint這一個參數(shù),表示返回的stats對象是bigint
類型,而不是通常的number
類型。以上操作的結(jié)果請參考fs.Stats
類。
它的同步版本為fs.statSync(path[, options], callback)
。
類似于fs.readFile
,該方法為文件的寫方法。
file參數(shù)為要寫入的文件路徑,或文件描述符。
data為要寫入的數(shù)據(jù),支持<string> 、 <Buffer> 、 <TypedArray> 、<DataView>等。
options支持三個參數(shù):encoding,默認(rèn)值’utf8’;mode,權(quán)限類型,默認(rèn)值0o666;flag,打開方式,默認(rèn)值w。
回調(diào)函數(shù)僅支持一個參數(shù),即可能拋出的異常對象。
該方法的同步版本為fs.writeFileSync(file, data[, options])
。
當(dāng)使用fs.open
打開一個文件時,一般使用fs.write
進行數(shù)據(jù)寫入,請參考fs.write。該方法可以精確地控制寫入位置,并且可以連續(xù)寫入數(shù)據(jù)。
以上所列舉的只是fs模塊中較為常用的一些api,官方文檔中還有很多其他用途的接口,感興趣的請參考nodejs中文網(wǎng) - fs模塊。
如果需要在async函數(shù)中使用上述api,可以調(diào)用fs模塊提供的promise封裝版本,如:
let fsPromises = require('fs').promises; // 或let fsPromises = require('fs/promises'); // 或let fs = require('fs'); let fsPromises = fs.promises; fsPromise.readFile().then((err, data) => { ... }) async function print (path) { try { let data = await fsPromise.readFile(path, 'utf8'); console.log(data); // 讀取成功,輸出data } catch (e => { ... // 讀取失敗 }) }
到此,關(guān)于“nodejs的哪個模塊能操作文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。