fs-extra是fs的一個擴充套件,提供了非常多的便利API,並且繼承了fs所有方法和為fs方法新增了promise的支援。
它應該是 fs 的替代品。
為什麼?
我厭倦了包括mkdirp,rimraf以及ncp在我的大部分專案中。
解決了什麼問題
使用前,必須瞭解第三方庫給現有庫解決了哪些問題,不要為了使用而使用。
fs-extra模擬了類似如Linux下的命令:
root$ rm -rf /
root$ mv tmpDir tmpNewDir
root$ mkdir -p one/two
root$ cp -r tmp tmpNew
...
複製程式碼
這很方便不是嗎?這才讓我深深地愛上了它!
安裝
npm install fs-extra -S
複製程式碼
用法
應該總是fs-extra代替fs使用,所有fs方法都附在fs-extra,fs如果未傳遞迴調,則所有方法都將返回promise。
不再需要這個
const fs = require('fs');
複製程式碼
你現在可以這樣做
const fs = require('fs-extra');
複製程式碼
如果你希望明確表示你在使用fs-extra,可以將fs識別符號改為fse
const fse = require('fs-extra');
複製程式碼
你可以保留兩者使用,但它是多餘的,因為 fs-extra 繼承了fs
const fs = require('fs');
const fse = require('fs-extra');
複製程式碼
Sync vs Async vs Async/Await
大多數方法預設為非同步,如果未傳遞迴調,則所有非同步方法將返回一個promise。
一個典型的例子:
const fs = require('fs-extra')
// 非同步方法,返回promise
fs.copy('/tmp/myfile', '/tmp/mynewfile')
.then(() => console.log('success!'))
.catch(err => console.error(err))
// 非同步方法,回撥函式
fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
if (err) return console.error(err)
console.log('success!')
})
// 同步方法,注意必須使用try catch包裹著才能捕獲錯誤
try {
fs.copySync('/tmp/myfile', '/tmp/mynewfile')
console.log('success!')
} catch (err) {
console.error(err)
}
// Async/Await:
async function copyFiles () {
try {
await fs.copy('/tmp/myfile', '/tmp/mynewfile')
console.log('success!')
} catch (err) {
console.error(err)
}
}
copyFiles()
複製程式碼
API Methods
下面的所有方法都是fs-extra擴充套件方法
Async/非同步
- copy
- emptyDir (別名:emptydir)
- ensureFile
- ensureDir (別名:mkdirp、mkdirs)
- ensureLink
- ensureSymlink
- mkdirp
- mkdirs
- move
- outputFile
- outputJson (別名:outputJSON)
- pathExists
- readJson (別名:readJSON)
- remove
- writeJson (別名:writeJSON)
Sync/同步
- copySync
- emptyDirSync
- ensureFileSync
- ensureDirSync
- ensureLinkSync
- ensureSymlinkSync
- mkdirpSync
- mkdirsSync
- moveSync
- outputFileSync
- outputJsonSync
- pathExistsSync
- readJsonSync
- removeSync
- writeJsonSync
1、copy(src: string, dest: string, [options: object, callback: func])
複製檔案或目錄,目錄可以包含內容,類似 cp -r
- src 請注意,如果src是目錄,它將複製此目錄內的所有內容,而不是整個目錄本身
- dest 請注意,如果src是檔案,dest則不能是目錄
- options
- overwrite : 覆蓋現有檔案或目錄,預設為true。請注意,如果將此設定為false並且目標存在,則複製操作將無提示失敗。使用該errorOnExist選項可更改此行為。
- errorOnExist : 當overwrite為false和目標存在時,丟擲錯誤。預設是false。
- dereference : dereference symlinks,預設是false。
- preserveTimestamps : 如果為true,將設定對原始原始檔的最後修改和訪問時間。如果為false,則時間戳行為取決於作業系統。預設是false。
- filter : 過濾複製檔案的功能。返回true包含,false排除。也可以返回Promise解析為true或false(或傳入async函式)。
- callback 回撥函式
例子:
const fs = require('fs-extra')
// With a callback:
fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
if (err) return console.error(err)
console.log('success!')
}) // copies file
fs.copy('/tmp/mydir', '/tmp/mynewdir', err => {
if (err) return console.error(err)
console.log('success!')
}) // copies directory, even if it has subdirectories or files
// With Promises:
fs.copy('/tmp/myfile', '/tmp/mynewfile')
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example () {
try {
await fs.copy('/tmp/myfile', '/tmp/mynewfile')
console.log('success!')
} catch (err) {
console.error(err)
}
}
example()
複製程式碼
使用過濾函式
const fs = require('fs-extra')
const filterFunc = (src, dest) => {
// your logic here
// it will be copied if return true
}
fs.copy('/tmp/mydir', '/tmp/mynewdir', { filter: filterFunc }, err => {
if (err) return console.error(err)
console.log('success!')
})
複製程式碼
2、emptyDir(dir: string, [callback: function])
確保目錄為空。如果目錄不為空,則刪除目錄內容。如果該目錄不存在,則建立該目錄。目錄本身不會被刪除。
別名: emptydir()
- dir 目標路徑
- callback 回撥方法
例子:
const fs = require('fs-extra')
// assume this directory has a lot of files and folders
// With a callback:
fs.emptyDir('/tmp/some/dir', err => {
if (err) return console.error(err)
console.log('success!')
})
// With Promises:
fs.emptyDir('/tmp/some/dir')
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example () {
try {
await fs.emptyDir('/tmp/some/dir')
console.log('success!')
} catch (err) {
console.error(err)
}
}
example()
複製程式碼
3、ensureFile(file: string, [callback: func])
確保檔案存在。如果請求建立的檔案位於不存在的目錄中,則會建立這些目錄。如果該檔案已存在,則不進行修改。
別名: createFile()
- file 目標路徑
- callback 回撥方法
例子:
const fs = require('fs-extra')
const file = '/tmp/this/path/does/not/exist/file.txt'
// With a callback:
fs.ensureFile(file, err => {
console.log(err) // => null
// file has now been created, including the directory it is to be placed in
})
// With Promises:
fs.ensureFile(file)
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (f) {
try {
await fs.ensureFile(f)
console.log('success!')
} catch (err) {
console.error(err)
}
}
example(file)
複製程式碼
4、ensureDir(dir: string, [callback: func])
如果目錄結構不存在,則建立它,如果目錄存在,則不進行建立,類似mkdir -p。
別名: mkdirs(), mkdirp()
- dir 目標路徑
- callback 回撥方法
例子:
const fs = require('fs-extra')
const dir = '/tmp/this/path/does/not/exist'
// With a callback:
fs.ensureDir(dir, err => {
console.log(err) // => null
// dir has now been created, including the directory it is to be placed in
})
// With Promises:
fs.ensureDir(dir)
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (directory) {
try {
await fs.ensureDir(directory)
console.log('success!')
} catch (err) {
console.error(err)
}
}
example(dir)
複製程式碼
5、ensureLink(srcpath: string, dstpath: string, [callback: func])
確保連結存在。如果目錄結構不存在,則建立它。
- srcpath 源路徑
- dstpath 目標路徑
- callback 回撥方法
例子
const fs = require('fs-extra')
const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
// With a callback:
fs.ensureLink(srcpath, dstpath, err => {
console.log(err) // => null
// link has now been created, including the directory it is to be placed in
})
// With Promises:
fs.ensureLink(srcpath, dstpath)
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (src, dest) {
try {
await fs.ensureLink(src, dest)
console.log('success!')
} catch (err) {
console.error(err)
}
}
example(srcpath, dstpath)
複製程式碼
6、ensureSymlink(srcpath: string, dstpath: string, [callback: func])
確保符號連結存在。如果目錄結構不存在,則建立它。
- srcpath 源路徑
- dstpath 目標路徑
- callback 回撥方法
const fs = require('fs-extra')
const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
// With a callback:
fs.ensureSymlink(srcpath, dstpath, err => {
console.log(err) // => null
// symlink has now been created, including the directory it is to be placed in
})
// With Promises:
fs.ensureSymlink(srcpath, dstpath)
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (src, dest) {
try {
await fs.ensureSymlink(src, dest)
console.log('success!')
} catch (err) {
console.error(err)
}
}
example(srcpath, dstpath)
複製程式碼
7、move(src: string, dest: string, [options: object, callback: func])
移動檔案或目錄,甚至跨裝置。 類似 mv
- srcpath 源路徑
- dstpath 目標路徑
- options
- overwrite : 覆蓋現有檔案或目錄,預設為false。
- callback 回撥方法
例子:
const fs = require('fs-extra')
const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
// With a callback:
fs.move(srcpath, dstpath, err => {
if (err) return console.error(err)
console.log('success!')
})
// With Promises:
fs.move(srcpath, dstpath, {
overwrite: true
})
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (src, dest) {
try {
await fs.move(srcpath, dstpath)
console.log('success!')
} catch (err) {
console.error(err)
}
}
example(srcpath, dstpath)
複製程式碼
8、outputFile(file: stirng, data: string|Buffer|Uint8Array, [options: string|object, callback: func])
幾乎與writeFile(即它覆蓋)相同,除了如果父目錄不存在,則建立它。file必須是檔案路徑(不允許使用緩衝區或檔案描述符)。
- file 寫入檔案路徑
- data 寫入檔案的資料
- options
- encoding | 預設為 'utf8'
- mode 預設為 0o666
- flag 詳見支援的檔案系統flag, 預設為 'w'
- callback 回撥方法
例子:
const fs = require('fs-extra')
const file = '/tmp/this/path/does/not/exist/file.txt'
// With a callback:
fs.outputFile(file, 'hello!', err => {
console.log(err) // => null
fs.readFile(file, 'utf8', (err, data) => {
if (err) return console.error(err)
console.log(data) // => hello!
})
})
// With Promises:
fs.outputFile(file, 'hello!')
.then(() => fs.readFile(file, 'utf8'))
.then(data => {
console.log(data) // => hello!
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (f) {
try {
await fs.outputFile(f, 'hello!')
const data = await fs.readFile(f, 'utf8')
console.log(data) // => hello!
} catch (err) {
console.error(err)
}
}
example(file)
複製程式碼
9、outputJson(file: string, object: object, [options: object, callback: func])
幾乎相同writeJson,除了如果目錄不存在,它就被建立了。
別名: outputJSON()
- file 寫入檔案路徑
- object 寫入檔案的JSON物件
- options
- encoding | 預設為 'utf8'
- mode 預設為 0o666
- flag 詳見支援的檔案系統flag, 預設為 'w'
- spaces <number|string> 縮排的空格數; 或者用於縮排的字串(即傳遞'\t'標籤縮排)
- EOL 設定EOL字元。預設是\n。
- replacer JSON replacer
- callback 回撥方法
例子:
const fs = require('fs-extra')
const file = '/tmp/this/path/does/not/exist/file.json'
// With a callback:
fs.outputJson(file, {name: 'JP'}, err => {
console.log(err) // => null
fs.readJson(file, (err, data) => {
if (err) return console.error(err)
console.log(data.name) // => JP
})
})
// With Promises:
fs.outputJson(file, {name: 'JP'})
.then(() => fs.readJson(file))
.then(data => {
console.log(data.name) // => JP
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (f) {
try {
await fs.outputJson(f, {name: 'JP'})
const data = await fs.readJson(f)
console.log(data.name) // => JP
} catch (err) {
console.error(err)
}
}
example(file)
複製程式碼
10、pathExists(file: string [, callback: func])
通過檢查檔案系統來測試給定路徑是否存在。類似fs.exists
- file 檔案路徑
- callback 回撥函式
例子:
const fs = require('fs-extra')
const file = '/tmp/this/path/does/not/exist/file.txt'
// With a callback:
fs.pathExists(file, (err, exists) => {
console.log(err) // => null
console.log(exists) // => false
})
// Promise usage:
fs.pathExists(file)
.then(exists => console.log(exists)) // => false
// With async/await:
async function example (f) {
const exists = await fs.pathExists(f)
console.log(exists) // => false
}
example(file)
複製程式碼
11、readJson(file: string, [options: object, callback: func])
讀取JSON檔案,然後將其解析為物件
別名: readJSON()
- file JSON檔案路徑
- options
- throws 如果為false並且JSON無效,它將不會丟擲err, 預設true
- callback 回撥函式
例子:
const fs = require('fs-extra')
// With a callback:
fs.readJson('./package.json', (err, packageObj) => {
if (err) console.error(err)
console.log(packageObj.version) // => 0.1.3
})
// With Promises:
fs.readJson('./package.json')
.then(packageObj => {
console.log(packageObj.version) // => 0.1.3
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example () {
try {
const packageObj = await fs.readJson('./package.json')
console.log(packageObj.version) // => 0.1.3
} catch (err) {
console.error(err)
}
}
example()
複製程式碼
12、remove(path: string, [callback: func])
刪除檔案或目錄。該目錄可以包含內容, 類似 rm -rf
- path 目標路徑
- callback 回撥函式
例子:
const fs = require('fs-extra')
// remove file
// With a callback:
fs.remove('/tmp/myfile', err => {
if (err) return console.error(err)
console.log('success!')
})
fs.remove('/home/jprichardson', err => {
if (err) return console.error(err)
console.log('success!') // I just deleted my entire HOME directory.
})
// With Promises:
fs.remove('/tmp/myfile')
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example (src, dest) {
try {
await fs.remove('/tmp/myfile')
console.log('success!')
} catch (err) {
console.error(err)
}
}
example()
複製程式碼
13、writeJson(file, object, [options, callback])
將物件寫入JSON檔案, 幾乎與outputJson相同,除了必須保證目錄存在外。
別名: writeJSON()
- file 寫入檔案路徑
- object 寫入檔案的JSON物件
- options
- encoding | 預設為 'utf8'
- mode 預設為 0o666
- flag 詳見支援的檔案系統flag, 預設為 'w'
- spaces <number|string> 縮排的空格數; 或者用於縮排的字串(即傳遞'\t'標籤縮排)
- EOL 設定EOL字元。預設是\n。
- replacer JSON replacer
- callback 回撥方法
例子:
const fs = require('fs-extra')
// With a callback:
fs.writeJson('./package.json', {name: 'fs-extra'}, err => {
if (err) return console.error(err)
console.log('success!')
})
// With Promises:
fs.writeJson('./package.json', {name: 'fs-extra'})
.then(() => {
console.log('success!')
})
.catch(err => {
console.error(err)
})
// With async/await:
async function example () {
try {
await fs.writeJson('./package.json', {name: 'fs-extra'})
console.log('success!')
} catch (err) {
console.error(err)
}
}
example()
複製程式碼
寫在最後
毋庸置疑fs-extra用在生產環境絕對是不錯的選擇,但是想要玩轉黑科技還是要多多瞭解fs模組,畢竟它才是老大。