fs-extra — это расширение fs, которое предоставляет множество удобных API, наследует все методы fs и добавляет поддержку промисов для методов fs.
должен быть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 всегда следует использовать fs-extra, все методы fs привязаны к fs-extra, все методы fs будут возвращать обещание, если не будет передан обратный вызов.
это больше не нужно
const fs = require('fs');
ты можешь сделать это сейчас
const fs = require('fs-extra');
Если вы хотите, чтобы было понятно, что вы используете fs-extra, вы можете изменить идентификатор fs на fse
const fse = require('fs-extra');
Вы можете оставить оба, но это избыточно, потому чтоfs-extraунаследовал фс
const fs = require('fs');
const fse = require('fs-extra');
Sync vs Async vs Async/Await
Большинство методов по умолчанию являются асинхронными, и все асинхронные методы возвращают обещание, если обратный вызов не передается.
Типичный пример:
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.
Асинхронный/асинхронный
- copy
- пустой каталог (псевдоним: пустой каталог)
- ensureFile
- sureDir (псевдоним: mkdirp, mkdirs)
- ensureLink
- ensureSymlink
- mkdirp
- mkdirs
- move
- outputFile
- outputJson (псевдоним: outputJSON)
- pathExists
- readJson (псевдоним: readJSON)
- remove
- writeJson (псевдоним: writeJSON)
Синхронизация/Синхронизация
- copySync
- emptyDirSync
- ensureFileSync
- ensureDirSync
- ensureLinkSync
- ensureSymlinkSync
- mkdirpSync
- mkdirsSync
- moveSync
- outputFileSync
- outputJsonSync
- pathExistsSync
- readJsonSync
- removeSync
- writeJsonSync
1. копировать (источник: строка, место назначения: строка, [параметры: объект, обратный вызов: функция])
Скопируйте файл или каталог, каталог может содержать содержимое, напримерcp -r
- srcОбратите внимание, что если src является каталогом, он скопирует все содержимое этого каталога, а не весь каталог.
- destОбратите внимание, что если src — это файл, то dest не может быть каталогом.
-
options
- overwrite: перезаписать существующие файлы или каталоги, по умолчанию — true. Обратите внимание, что если для этого параметра установлено значение false и цель существует, операция копирования завершится неудачно. Используйте параметр errorOnExist, чтобы изменить это поведение.
- errorOnExist: выдает ошибку, когда перезапись имеет значение false и цель существует. Значение по умолчанию — ложь.
- dereference: символические ссылки разыменования, по умолчанию false.
- preserveTimestamps: Если true, будет установлена последняя модификация и время доступа к исходному файлу. Если false, поведение метки времени зависит от ОС. Значение по умолчанию — ложь.
- filter: Фильтр функции копирования файлов. Возвращает true для включения и false для исключения. Также возможно вернуть обещание, которое разрешается как true или false (или передать асинхронную функцию).
- 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 (каталог: строка, [обратный вызов: функция])
Убедитесь, что каталог пуст. Если каталог не пуст, удалите содержимое каталога. Создайте каталог, если он не существует. Сам каталог не удаляется.
Псевдоним: 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. sureFile (файл: строка, [обратный вызов: функция])
Убедитесь, что файл существует. Если запрашиваемый файл находится в несуществующем каталоге, эти каталоги будут созданы. Если файл уже существует, никакие изменения не вносятся.
Псевдоним: 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. sureDir(dir: string, [обратный вызов: 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. sureLink(srcpath: строка, dstpath: строка, [обратный вызов: 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.sureSymlink(srcpath: строка, dstpath: строка, [обратный вызов: 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(файл: перемешивание, данные: строка|буфер|Uint8Array, [опции: строка|объект, обратный вызов: функция])
Почти так же, как writeFile (т. е. перезаписывает), за исключением того, что родительский каталог создается, если он не существует. файл должен быть путем к файлу (буферы или файловые дескрипторы не допускаются).
- fileнаписать путь к файлу
- dataданные записываются в файл
-
options
- encoding| По умолчанию используется utf8.
- modeПо умолчанию 0o666
- 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 (файл: строка, объект: объект, [параметры: объект, обратный вызов: функция])
Практически то же самое, что и writeJson, за исключением того, что если каталог не существует, он создается.
Псевдоним: outputJSON()
- fileнаписать путь к файлу
- objectОбъект JSON, записанный в файл
-
options
- encoding| По умолчанию используется utf8.
- modeПо умолчанию 0o666
- 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 (файл: строка [ обратный вызов: функция])
Проверяет существование заданного пути, проверяя файловую систему. Похоже на: 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 (файл: строка, [параметры: объект, обратный вызов: функция])
Прочитайте файл JSON, затем разберите его на объект
Псевдоним: readJSON()
- fileПуть к JSON-файлу
-
options
- throwsЕсли false и JSON недействителен, он не выдаст ошибку, по умолчанию 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. удалить (путь: строка, [обратный вызов: функция])
Удалить файлы или каталоги. Каталог может содержать контент, например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(файл, объект, [параметры, обратный вызов])
Записывает объекты в файлы JSON почти так же, как outputJson, за исключением того, что каталог должен существовать.
Псевдоним: writeJSON()
- fileнаписать путь к файлу
- objectОбъект JSON, записанный в файл
-
options
- encoding| По умолчанию используется utf8.
- modeПо умолчанию 0o666
- 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, в конце концов, это босс.