[toc]
Время создания: 2019-08-12
Примечание. В win10 среда v10.16.1 работает без проблем.
Сначала введите соответствующие пакеты (которые будут подробно объяснены в момент использования):
const fs = require('fs')
const path = require('path')
const child_process = require('child_process')
const fsEx = require('fs-extra')
/**
* @des 该包为实验性API
*/
const fsPromises = require('fs').promises
операции с файлами
Копировать файл
Вот три способа:
- Сочетание writeFileSync и readFileSync
- использовать копифилесинк
- Использование метода промисов copyFile
Синхронные или асинхронные методы могут быть изменены по мере необходимости, а код реализации выглядит следующим образом.
/**
* @param { copiedPath: String } (被复制文件的地址,相对地址)
* @param { resultPath: String } (放置复制文件的地址,相对地址)
*/
function copyFile(copiedPath, resultPath) {
copiedPath = path.join(__dirname, copiedPath)
resultPath = path.join(__dirname, resultPath)
try {
/**
* @des 方式一
*/
// fs.writeFileSync(resultPath, fs.readFileSync(copiedPath))
/**
* @des 方式二
*/
// fs.copyFileSync(copiedPath, resultPath)
console.log('success');
} catch (error) {
console.log(error);
}
/**
* @des 方式三
*/
fsPromises.copyFile(copiedPath, resultPath)
.then(() => {
console.log('success');
}).catch((err) => {
console.log(err);
});
}
Удалить файлы
использоватьunlinkSync
метод, код реализации выглядит следующим образом
/**
* @param { delPath:String } (需要删除文件的地址)
* @param { direct:Boolean } (是否需要处理地址)
*/
function deleteFile(delPath, direct) {
delPath = direct ? delPath : path.join(__dirname, delPath)
try {
/**
* @des 判断文件或文件夹是否存在
*/
if (fs.existsSync(delPath)) {
fs.unlinkSync(delPath);
} else {
console.log('inexistence path:', delPath);
}
} catch (error) {
console.log('del error', error);
}
}
Операции с папками (каталогами)
В следующем коде есть ссылки для копирования методов, связанных с файлом.
копировать папку
Используются два метода:
- child_process
- Рекурсивно читать файлы и папки и создавать их по указанному адресу
Код реализации и объяснение следующие:
/**
* @des 参数解释同上
*/
function copyFolder(copiedPath, resultPath, direct) {
if(!direct) {
copiedPath = path.join(__dirname, copiedPath)
resultPath = path.join(__dirname, resultPath)
}
function createDir (dirPath) {
fs.mkdirSync(dirPath)
}
if (fs.existsSync(copiedPath)) {
createDir(resultPath)
/**
* @des 方式一:利用子进程操作命令行方式
*/
// child_process.spawn('cp', ['-r', copiedPath, resultPath])
/**
* @des 方式二:
*/
const files = fs.readdirSync(copiedPath, { withFileTypes: true });
for (let i = 0; i < files.length; i++) {
const cf = files[i]
const ccp = path.join(copiedPath, cf.name)
const crp = path.join(resultPath, cf.name)
if (cf.isFile()) {
/**
* @des 创建文件,使用流的形式可以读写大文件
*/
const readStream = fs.createReadStream(ccp)
const writeStream = fs.createWriteStream(crp)
readStream.pipe(writeStream)
} else {
try {
/**
* @des 判断读(R_OK | W_OK)写权限
*/
fs.accessSync(path.join(crp, '..'), fs.constants.W_OK)
copyFolder(ccp, crp, true)
} catch (error) {
console.log('folder write error:', error);
}
}
}
} else {
console.log('do not exist path: ', copiedPath);
}
}
удалить папку
Рекурсивно файлы и папки, удалять по одному
Код реализации выглядит следующим образом:
function deleteFolder(delPath) {
delPath = path.join(__dirname, delPath)
try {
if (fs.existsSync(delPath)) {
const delFn = function (address) {
const files = fs.readdirSync(address)
for (let i = 0; i < files.length; i++) {
const dirPath = path.join(address, files[i])
if (fs.statSync(dirPath).isDirectory()) {
delFn(dirPath)
} else {
deleteFile(dirPath, true)
}
}
/**
* @des 只能删空文件夹
*/
fs.rmdirSync(address);
}
delFn(delPath);
} else {
console.log('do not exist: ', delPath);
}
} catch (error) {
console.log('del folder error', error);
}
}
Пример выполнения
Структура каталогов
|- index.js(主要执行代码)
|- a
|- a.txt
|- b.txt
|- c
|- a.txt
|- b.txt
|- p
|- a.txt
|- b.txt
Выполнить соответствующий метод в соответствии с параметрами, переданными в
/**
* @des 获取命令行传递的参数
*/
const type = process.argv[2]
function execute() {
/**
* @des 请根据不同的条件传递参数
*/
if (type === 'copyFile') {
copyFile('./p/a.txt', './c/k.txt')
}
if (type === 'copyFolder') {
copyFolder('./p', './a')
}
if (type === 'delFile') {
deleteFile('./c/ss.txt')
}
if (type === 'delFolder') {
deleteFolder('./a')
}
}
execute()
Передать параметры командной строки
/**
* @des 命令行传参
* 执行 node ./xxx/index.js 111 222
* 输出:
* 0: C:\Program Files\nodejs\node.exe
* 1: G:\GitHub\xxx\xxxx\index.js
* 2: 111
* 3: 222
*/
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
});
Реализовано с помощью fs-extra
Это инкапсуляция методов, связанных с fs, которая проще и быстрее в использовании.
/**
* @des fs-extra 包实现
* api参考: https://github.com/jprichardson/node-fs-extra
*/
function fsExtra() {
async function copy() {
try {
await fsEx.copy(path.join(__dirname + '/p'), path.join(__dirname + '/d'))
console.log('success');
} catch (error) {
console.log(error);
}
}
copy()
}
Исполняемый исходный код:GitHub.com/имя он/вас…
Добро пожаловать на обменGithub