node:常用的文件操作fs模块

news2024/11/26 13:36:09

文章目录

    • 背景
    • 创建
    • 复制
    • 移动(重命名)
    • 是否存在
    • 删除
    • 示例
      • 1、文件内容替换
      • 2、文件夹内的所有文件内容替换
    • 封装

背景

我们日常工作中,想要对前端做一些自动化操作的时候,免不了使用 node 的文件读写操作,今天来总结一下 fs 模块常用的操作。

在实际工作中,为了工程化,最好将 fs 模块进行封装,比如捕获一下错误等等,这样就不用每次都 try catch 了。可以看文末的封装

读文件:fs.readFileSync

// 一般对于路径相关的要用__dirname等操作拼接一下,如果直接写相对路径可能会有问题,比如:index.js中写了相对路径,那么执行node test/index.js 和 cd test && node index.js是不一样的。
const sourcePath = path.resolve(__dirname, './index.js')
// 这里拿到的content就是文件内容的字符串
const content = fs.readFileSync(sourcePath, 'utf-8')

读文件夹:fs.readFileSync

const sourcePath = path.resolve(__dirname, './')
const content = fs.readdirSync(sourcePath, 'utf-8')
// 返回的是文件夹下的文件数组:[ 'index.js', 'tool.js' ]

写入文件,若文件不存在则创建文件

// sourcePath:源文件路径
// outputContent:要写入的内容
fs.writeFileSync(sourcePath, outputContent, 'utf-8');

追加到文件尾部,另起一行

// sourcePath:源文件路径
// outputContent:要写入的内容
fs.appendFileSync(sourcePath, '追加的文字');

创建

创建文件

见上面写入文件

创建目录

// 创建 test 目录
const sourcePath = path.resolve(__dirname, './test')
// 创建多个目录
const sourcePath = path.resolve(__dirname, './test/test1')
fs.mkdirSync(sourcePath);

复制

复制文件

const sourcePath = path.resolve(__dirname, './index.js')
const outputPath = path.resolve(__dirname, './test.js')
fs.copyFileSync(sourcePath, outputPath);

复制目录
1、第三方库

// 使用第三方模块
var fs = require("fs-extra");
fs.copySync("./source/myDirectory", "./target/myDirectory")

2、原生方式
nodejs 从 16.7.0 版本开始,新加入了一个fs.cp()方法,可以复制目录(不管目标目录是否存在都可自动创建)。当需要复制目录时,需要将配置中的recursive属性设置为 true。

const sourcePath = path.resolve(__dirname, './source/')
const outputPath = path.resolve(__dirname, './target/')
const res = fs.cpSync(sourcePath, outputPath, { recursive: true });

3、自己写递归复制
见底部封装

移动(重命名)

const sourcePath = path.resolve(__dirname, './index.js')
const outputPath = path.resolve(__dirname, './test.js')
const res = fs.renameSync(sourcePath, outputPath);

是否存在

是否是文件

const sourcePath = path.resolve(__dirname, './index.js')
const stats = fs.statSync(sourcePath);
const isFile = stats.isFile()

是否是目录

const sourcePath = path.resolve(__dirname, './index.js')
const stats = fs.statSync(sourcePath);
const isDirectory = stats.isDirectory()

删除

删除文件

const sourcePath = path.resolve(__dirname, './index.js')
const res = fs.unlinkSync(sourcePath);

删除目录
必须是空目录才能删除,如果里面有文件此命令报错

const sourcePath = path.resolve(__dirname, './test')
const res = fs.rmdirSync(sourcePath);

示例

1、文件内容替换

将 index.js 文件中的 aaa 替换为 hhh,在 tool.js 写入以下代码:

const fs = require('fs')
const path = require('path')

const sourcePath = path.resolve(__dirname, './index.js')
const content = fs.readFileSync(sourcePath, 'utf-8')
const outputContent = content.replaceAll(/aaa/g, "hhh");
fs.writeFileSync(sourcePath, outputContent, 'utf-8');

写完后执行 node tool.js ,这时 aaa 已经变为 hhh 了
在这里插入图片描述

2、文件夹内的所有文件内容替换

思路:读取文件夹并遍历,如果是文件则读取替换,如果是文件夹则继续递归遍历。

方案:使用 shell 的文件替换,可以看 这篇,使用 node 开启一个子进程执行 shell 脚本。

const process = require("child_process");
process.exec('sh xxx.sh', (error, stdout, stderr) => {
  if (!error) {
    // 成功
  } else {
    // 失败
  }
});

封装

import fs from 'fs';
import path from 'path';
import globPkg from 'glob';
import mkdirp from 'mkdirp';

export const copyFile = (source, target) =>
  new Promise((resolve, reject) => {
    let cbCalled = false;
    function done(err) {
      if (!cbCalled) {
        cbCalled = true;
        if (err) {
          reject(err);
        } else {
          resolve(true);
        }
      }
    }

    const rd = fs.createReadStream(source);
    rd.on('error', (err) => done(err));
    const wr = fs.createWriteStream(target);
    wr.on('error', (err) => done(err));
    wr.on('close', (err) => done(err));
    rd.pipe(wr);
  });

export const readFile = (file) =>
  new Promise((resolve, reject) => {
    fs.readFile(file, 'utf8', (err, data) =>
      err ? reject(err) : resolve(data)
    );
  });

export const writeFile = (file, contents) =>
  new Promise((resolve, reject) => {
    fs.writeFile(file, contents, 'utf8', (err) =>
      err ? reject(err) : resolve(true)
    );
  });

export const glob = (pattern: string): Promise<string[]> =>
  new Promise((resolve, reject) => {
    globPkg(pattern, (err, val) => (err ? reject(err) : resolve(val)));
  });

export const fileExist = async (pattern) => {
  const fileList = await glob(pattern);
  return fileList.length !== 0;
};

export const makeDir = async (name) => {
  await mkdirp(name);
};

export const readDir = (pattern, options): Promise<string[]> =>
  new Promise((resolve, reject) =>
    globPkg(pattern, options, (err, result) =>
      err ? reject(err) : resolve(result)
    )
  );

export const copyDir = async (source, target) => {
  const dirs = await readDir('**/*.*', {
    cwd: source,
    nosort: true,
    dot: true
  });
  await Promise.all(
    dirs.map(async (dir) => {
      const from = path.resolve(source, dir);
      const to = path.resolve(target, dir);
      await makeDir(path.dirname(to));
      await copyFile(from, to);
    })
  );
};

export const renameFile = (source, target) =>
  new Promise((resolve, reject) => {
    fs.rename(source, target, (err) => (err ? reject(err) : resolve(true)));
  });

export const rmFile = async (source) =>
  new Promise((resolve, reject) => {
    fs.unlink(source, (err) => {
      if (err) {
        reject(err);
      } else {
        resolve(true);
      }
    });
  });

export default {
  readFile,
  writeFile,
  copyFile,
  glob,
  fileExist,
  makeDir,
  renameFile,
  rmFile
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM 堆

堆的核心概述 一个 JVM 实例只存在一个堆内存&#xff0c;堆也是 Java 内存管理的核心区域Java 堆区在 JVM 启动的时候即被创建&#xff0c;其空间大小也就确定了。是 JVM 管理的最大一块内存空间堆可以处于物理上不连续的内存空间中&#xff0c;但是在逻辑上它应该被视为连续…

久戴不痛的蓝牙耳机有哪些?久戴不痛的蓝牙耳机推荐

现如今的都市青年离不开什么数码产品&#xff1f;抛开手机这一答案&#xff0c;耳机肯定是第一项&#xff0c;遇到嘈杂的车流声&#xff0c;轰鸣的地铁&#xff0c;安静的图书馆&#xff0c;蓝牙耳机可以可以让人更加沉浸在自己的世界里&#xff0c;很多烧友在选购时候除了对音…

MySQL基础(二十七)性能分析工具的使用

1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f;这里把思考的流程整理成下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和行动&#xff08;Action&#xff09;两个部分。字母 S 的部分代表观察&…

全网最详细,性能测试场景模型分析,从0到1实施性能测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

资深测试总结,Python接口自动化测试-数据依赖解决(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

MyBatis学习 (一) 配置文件解析流程

MyBatis源码学习 最近在学习MyBatis的代码。记录下 首先下载下源码&#xff1a; https://github.com/mybatis/parent https://github.com/mybatis/mybatis-3 parent为父控依赖。也需要下载。 入口 InputStream inputStream null; try {// 获取配置文件inputStream Reso…

Java经典笔试题—day06

Java经典笔试题—day06 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;不要二&#x1f95d;把字符串转换成整数 &#x1f50e;结尾 &#x1f50e;选择题 (1)关于抽象类与最终类&#xff0c;下列说法错误的是&#xff1f; A. 抽象类能被继承&#xff0c;最终类只能被实…

Python、Pytest、Allure、Selenium和Jenkins实现自动化测试集成实例

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 本文将介绍如何使用Python、Pytest、Allur…

燃气巡检系统

燃气管网检查是整个管网可靠运行的重要保证&#xff0c;尤其是加强天然气管道巡检管理更是重中之重。要做好管网维护工作&#xff0c;必须认真把握好每个环节&#xff0c;每个过程&#xff0c;每个细节&#xff0c;认真落实管网巡维制度等&#xff0c;而通过凡尔码管理系统可使…

程序员痛心流涕自述:“因为把自己代码给了别人,我亲手断送了自己的前程”

在求职的过程中&#xff0c;一般都会有投递简历、笔试、面试以及背调的环节&#xff0c;而在这几个环节中折戟沉沙的人也着实不少。 不少人觉得&#xff0c;在求职时简历需要优化&#xff0c;背调不能有瞒报、捏造的情况&#xff0c;而笔试面试则是纯纯的要靠硬实力。 虽然说…

MySQL基础(二十六)索引的创建与设计原则

1. 索引的声明与使用 1. 1 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从功能逻辑上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 按照物理实现方式&#xff0c;索引可以分…

【Linux】shell编程之循环语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、循环语句二、for循环语句1.for 语句的结构2.for语句应用示例 三、while 循环语句1.while 循环语句结构2.while语句应用示例 四、until 循环五、跳出循环六、死循…

【Linux】信号的保存

信号的小细节真的很多~ 文章目录 前言一、信号的保存总结 前言 首先我们先引出一个新的概念&#xff0c;叫核心转储。linux系统提供了一种能力&#xff0c;操作系统可以将一个进程在异常的时候将核心代码部分进行核心转储&#xff0c;将内存中进程的相关数据全部dump到磁盘中&…

新版ripro全站美化子主题美化包使用说明手册

前言: 安装 Ripro 前,首先是需要先安装好 WordPress 主程序,因为 Ripro和美化包只是 WordPress 的一枚主题而已! 如何安装 WordPress 并不在本教程范围内,建议百度 如何安装好 WordPress ,但是还是想建议一下,尽量选择 Linux+php+nginx 的机器来安装 WordPress! 安装…

win部署CAS服务并使用

前提描述&#xff1a;通过本次了解cas是个什么东西&#xff0c;并使用它。 cas为oss(单点登录)的一种实现方案。要实现cas单点登录&#xff0c;首先需要部署cas的server服务。 CAS是Central Authentication Service的缩写&#xff0c;中央认证服务&#xff0c;。 一、安装CAS…

若依管理系统RuoYi-Vue:权限系统设计详解

文章目录 摘要数据库表结构设计菜单管理目录、菜单和按钮的区别菜单权限 api接口权限配置方法PreAuthorize注解介绍数据权限 前端vue权限拦截菜单权限按钮权限 摘要 若依&#xff08;RuoYi&#xff09;是一款基于Spring Boot和Vue.js开发的快速开发平台&#xff0c;它的权限管…

今天面了个阿里拿25k出来的小哥,让我见识到了什么是测试天花板

2022年堪称大学生就业最难的一年&#xff0c;应届毕业生人数是1076万。失业率超50%&#xff01; 但是我观察到一个数据&#xff0c;那就是已经就业的毕业生中&#xff0c;计算机通信等行业最受毕业生欢迎&#xff01; 计算机IT行业薪资高&#xff0c;平均薪资是文科其他岗位的…

优秀CRM系统的四个条件

如今&#xff0c;构建“以客户为中心”的经营模式&#xff0c;是许多企业提升竞争力的核心战略。CRM系统能够管理客户关系&#xff0c;提高销售线索转化率&#xff0c;帮助企业实现业绩增长。那么众多品牌中&#xff0c;CRM系统哪家公司做得更好&#xff1f; CRM做得好有哪几个…

Vue换肤主题

拷贝颜色选择组件 **ThemePicker <template><!-- navabar的换肤组件 --><el-color-pickerv-model="theme":predefine="[#409EFF,

智慧校园水电节能监管系统

现阶段各高校用电设备量多范围广&#xff0c;包含寝室、办公室、教室、会议厅、试验室、公共图书馆、运动场馆、饭堂、路面、园林绿化等地方&#xff0c;能耗极大。而且大多数节能意识薄弱&#xff0c;欠缺科学合理、科学合理的规章制度开展监管&#xff0c;造成电力能源很多消…