node-"fs-extra"模塊代替fs使用

node-

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則不能是目錄
  • optionsoverwrite : 覆蓋現有文件或目錄,默認為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 目標路徑
  • optionsoverwrite : 覆蓋現有文件或目錄,默認為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 寫入文件的數據
  • optionsencoding | 默認為 '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對象
  • optionsencoding | 默認為 'utf8'
  • mode 默認為 0o666
  • flag 詳見支持的文件系統flag, 默認為 'w'
  • spaces 縮進的空格數; 或者用於縮進的字符串(即傳遞'\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文件路徑
  • optionsthrows 如果為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對象
  • optionsencoding | 默認為 'utf8'
  • mode 默認為 0o666
  • flag 詳見支持的文件系統flag, 默認為 'w'
  • spaces 縮進的空格數; 或者用於縮進的字符串(即傳遞'\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模塊,畢竟它才是老大。


分享到:


相關文章: