Node.js中fs模块详解
Node.js 中 fs 模块(非 Promise)API 详解
Node.js 的 fs 模块提供了同步和异步的文件系统操作。以下是非 Promise 版本的 API 详解:
1. 文件读取操作
const fs = require('fs');// 异步读取文件
fs.readFile('file.txt', 'utf8', (err, data) => {if (err) {console.error('读取文件失败:', err);return;}console.log('文件内容:', data);
});// 同步读取文件
try {const data = fs.readFileSync('file.txt', 'utf8');console.log('文件内容:', data);
} catch (err) {console.error('读取文件失败:', err);
}// 使用文件描述符读取
fs.open('file.txt', 'r', (err, fd) => {if (err) {console.error('打开文件失败:', err);return;}const buffer = Buffer.alloc(100);fs.read(fd, buffer, 0, 100, 0, (err, bytesRead, buffer) => {if (err) {console.error('读取文件失败:', err);fs.close(fd, () => {});return;}console.log('读取字节数:', bytesRead);console.log('文件内容:', buffer.toString());fs.close(fd, (err) => {if (err) console.error('关闭文件失败:', err);});});
});
2. 文件写入操作
// 异步写入文件
fs.writeFile('output.txt', 'Hello World', 'utf8', (err) => {if (err) {console.error('写入文件失败:', err);return;}console.log('写入文件成功');
});// 同步写入文件
try {fs.writeFileSync('output.txt', 'Hello World', 'utf8');console.log('写入文件成功');
} catch (err) {console.error('写入文件失败:', err);
}// 追加内容
fs.appendFile('log.txt', 'New log entry\n', 'utf8', (err) => {if (err) {console.error('追加内容失败:', err);return;}console.log('追加内容成功');
});// 使用文件描述符写入
fs.open('file.txt', 'w', (err, fd) => {if (err) {console.error('打开文件失败:', err);return;}fs.write(fd, 'Hello World', 0, 'utf8', (err, written, string) => {if (err) {console.error('写入文件失败:', err);fs.close(fd, () => {});return;}console.log('写入字节数:', written);fs.close(fd, (err) => {if (err) console.error('关闭文件失败:', err);});});
});
3. 文件操作
// 复制文件
fs.copyFile('source.txt', 'dest.txt', (err) => {if (err) {console.error('复制文件失败:', err);return;}console.log('复制文件成功');
});// 重命名文件
fs.rename('old.txt', 'new.txt', (err) => {if (err) {console.error('重命名文件失败:', err);return;}console.log('重命名文件成功');
});// 删除文件
fs.unlink('file.txt', (err) => {if (err) {console.error('删除文件失败:', err);return;}console.log('删除文件成功');
});// 创建硬链接
fs.link('source.txt', 'link.txt', (err) => {if (err) {console.error('创建硬链接失败:', err);return;}console.log('创建硬链接成功');
});// 创建符号链接
fs.symlink('target.txt', 'symlink.txt', (err) => {if (err) {console.error('创建符号链接失败:', err);return;}console.log('创建符号链接成功');
});// 读取符号链接
fs.readlink('symlink.txt', (err, linkString) => {if (err) {console.error('读取符号链接失败:', err);return;}console.log('符号链接目标:', linkString);
});// 获取文件信息
fs.stat('file.txt', (err, stats) => {if (err) {console.error('获取文件信息失败:', err);return;}console.log('Is file:', stats.isFile());console.log('Size:', stats.size);console.log('Created:', stats.birthtime);console.log('Modified:', stats.mtime);
});// 修改文件权限
fs.chmod('file.txt', 0o666, (err) => {if (err) {console.error('修改文件权限失败:', err);return;}console.log('修改文件权限成功');
});// 修改文件所有者
fs.chown('file.txt', 1000, 1000, (err) => {if (err) {console.error('修改文件所有者失败:', err);return;}console.log('修改文件所有者成功');
});
4. 目录操作
// 创建目录
fs.mkdir('new-directory', { recursive: true }, (err) => {if (err) {console.error('创建目录失败:', err);return;}console.log('创建目录成功');
});// 读取目录
fs.readdir('directory', (err, files) => {if (err) {console.error('读取目录失败:', err);return;}console.log('目录内容:', files);
});// 删除目录
fs.rmdir('empty-directory', (err) => {if (err) {console.error('删除目录失败:', err);return;}console.log('删除目录成功');
});// 递归删除目录
fs.rm('directory', { recursive: true, force: true }, (err) => {if (err) {console.error('递归删除目录失败:', err);return;}console.log('递归删除目录成功');
});// 获取目录信息
fs.stat('directory', (err, stats) => {if (err) {console.error('获取目录信息失败:', err);return;}console.log('Is directory:', stats.isDirectory());
});// 修改目录权限
fs.chmod('directory', 0o755, (err) => {if (err) {console.error('修改目录权限失败:', err);return;}console.log('修改目录权限成功');
});
5. 文件监视
// 监视文件变化
const watcher = fs.watch('file.txt', (eventType, filename) => {console.log(`Event: ${eventType}, File: ${filename}`);
});// 停止监视
watcher.close();// 监视目录
const dirWatcher = fs.watch('directory', { recursive: true }, (eventType, filename) => {console.log(`Directory event: ${eventType}, File: ${filename}`);
});// 停止目录监视
dirWatcher.close();
6. 文件流操作
// 创建读取流
const readStream = fs.createReadStream('input.txt', {encoding: 'utf8',highWaterMark: 64 * 1024 // 64KB 缓冲区
});// 创建写入流
const writeStream = fs.createWriteStream('output.txt', {encoding: 'utf8',flags: 'a'
});// 流事件处理
readStream.on('data', (chunk) => {console.log('Received chunk:', chunk);
});readStream.on('end', () => {console.log('Finished reading');
});readStream.on('error', (error) => {console.error('Read error:', error);
});// 管道操作
readStream.pipe(writeStream);// 关闭流
readStream.destroy();
writeStream.end();
7. 临时文件操作
// 创建临时目录
fs.mkdtemp('prefix-', (err, folder) => {if (err) {console.error('创建临时目录失败:', err);return;}console.log('临时目录:', folder);// 在临时目录中创建文件const tempFile = path.join(folder, 'temp.txt');fs.writeFile(tempFile, 'Temporary content', (err) => {if (err) {console.error('创建临时文件失败:', err);return;}console.log('临时文件创建在:', tempFile);});
});
8. 文件系统信息
// 获取文件系统信息
fs.statfs('/', (err, stats) => {if (err) {console.error('获取文件系统信息失败:', err);return;}console.log('Total space:', stats.blocks * stats.bsize);console.log('Free space:', stats.bfree * stats.bsize);
});// 获取文件描述符
fs.open('file.txt', 'r', (err, fd) => {if (err) {console.error('打开文件失败:', err);return;}console.log('File descriptor:', fd);fs.close(fd, (err) => {if (err) console.error('关闭文件失败:', err);});
});
9. 错误处理
// 检查文件是否存在
fs.access('nonexistent.txt', fs.constants.F_OK, (err) => {if (err) {if (err.code === 'ENOENT') {console.log('文件不存在');} else if (err.code === 'EACCES') {console.log('没有访问权限');} else {console.error('其他错误:', err);}} else {console.log('文件存在');}
});
10. 常量
// 文件打开模式
const modes = {READ: fs.constants.O_RDONLY,WRITE: fs.constants.O_WRONLY,READ_WRITE: fs.constants.O_RDWR,APPEND: fs.constants.O_APPEND,CREATE: fs.constants.O_CREAT,EXCL: fs.constants.O_EXCL,TRUNC: fs.constants.O_TRUNC
};// 文件类型
const types = {FILE: fs.constants.S_IFREG,DIRECTORY: fs.constants.S_IFDIR,SYMBOLIC_LINK: fs.constants.S_IFLNK,SOCKET: fs.constants.S_IFSOCK,CHARACTER_DEVICE: fs.constants.S_IFCHR,BLOCK_DEVICE: fs.constants.S_IFBLK,FIFO: fs.constants.S_IFIFO
};
这些是 Node.js fs 模块(非 Promise 版本)的主要 API。与 Promise 版本相比,这些 API 使用回调函数而不是返回 Promise。
相关文章:
Node.js中fs模块详解
Node.js 中 fs 模块(非 Promise)API 详解 Node.js 的 fs 模块提供了同步和异步的文件系统操作。以下是非 Promise 版本的 API 详解: 1. 文件读取操作 const fs require(fs);// 异步读取文件 fs.readFile(file.txt, utf8, (err, data) >…...
特殊定制版,太给力了!
今天给大家分享一款超棒的免费录屏软件,真的是录屏的好帮手! 这款软件功能可以录制 MP4、AVI、WMV 格式的标清、高清、原画视频,满足你各种需求。 云豹录屏大师 多功能录屏神器 它的界面特别简洁,上手超快,用起来很顺…...
go:实现最简单区块链
1.新建文件夹命名为blockchain,在此文件夹下分别创建两个文件一个为block.go另一个为chain.go如下图所示: 2.写入代码: block.go package blockchainimport ("bytes""crypto/sha256""encoding/gob""log""strconv""ti…...
工业相机使用笔记
目前工业相机有多种分类方式,以下是基于不同原理和特点的类别总结: 按维度分类 2D相机: 原理:通过镜头将二维平面上的物体成像在图像传感器上,传感器上的像素点阵列捕捉物体的光信号,并转换为电信号或数字…...
系分论文《论面向服务开发方法在设备租赁行业的应用》
系统分析师论文系列 【摘要】 2022年5月,我司承接某工程机械租赁企业"智能租赁运营管理平台"建设项目,我作为系统分析师主导系统架构设计。该项目需整合8大类2000余台设备资产,覆盖全国15个区域运营中心与300家代理商,实…...
【Code】《代码整洁之道》笔记-Chapter12-迭进
第12章 迭进 12.1 通过迭进设计达到整洁目的 假使有4条简单的规则,跟着做就能帮助你创建优良的设计,会如何?假使遵循这些规则,你就能洞见代码的结构和设计,更能轻易地应用SRP和DIP之类的原则,便会如何&…...
04--网络属性设置与多路复用
一、TCP可靠性分析 二、 scoket 属性设置 1、socket 属性设置表 NAMEgetsockopt, setsockopt - get and set options on sockets获取 和 设置 套接字属性 SYNOPSIS#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int so…...
AI领域再突破,永洪科技荣获“2025人工智能+创新案例”奖
在2025年的今天,人工智能已从技术概念全面渗透至产业核心。中国作为全球AI技术应用的前沿阵地,正通过“人工智能”行动加速推进技术与实体经济深度融合。 这一背景下,永洪科技凭借其“国内某头部ICT人力资源板块GenAI项目”荣获“2025全国企业…...
基于疾风大模型的新能源储能优化系统:方法、实现与案例分析
一、引言 随着可再生能源渗透率不断提高,储能系统在电力系统中的重要性日益凸显。传统储能控制方法主要基于规则策略和简单优化算法,难以应对高比例新能源场景下的复杂决策需求。本文将详细介绍如何利用疾风大模型(Gale Model)构建智能化的新能源储能优化系统,包含核心方…...
菊风RTC 2.0 开发者文档正式发布,解锁音视频新体验!
重磅发布! 开发者们,菊风实时音视频2.0文档已正式发布上线,为您提供更清晰、更高效的开发支持!让菊风实时音视频2.0为您的音视频应用加速~ 菊风实时音视频2.0聚焦性能升级、体验升级、录制服务升级,助力视频通话、语…...
12c补丁滚动升级
12c打补丁前置检查 备份文件,可以不做,因为文件可能很大,如果可以备份整个安装文件。 1.check grid: % /u01/app/12.1.0/grid/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /home/software/27010872/2691…...
OpenCv高阶(一)——图像金字塔(上采样、下采样)
目录 图像金字塔 一、上下采样原理 1、向下取样 2、向上采样 3、图像金字塔的作用 二、案例实现 1、高斯下采样 2、高斯金字塔中的上采样 3、对下采样的结果做上采样,图像变模糊,无法复原 4、拉普拉斯金字塔(图片复原) 图…...
LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】
LEARNING DYNAMICS OF LLM FINETUNING 一句话总结 作者将LLM的学习动力机制拆解成AKG三项,并分别观察了SFT和DPO训练过程中正梯度信号和负梯度信号的变化及其带来的影响,并得到以下结论: SFT通过梯度相似性间接提升无关…...
数据集 | 沥青路面缺陷目标检测
文章目录 一、数据集概述1. 行业痛点与数据集价值2. 数据集技术规格 二、样本类别详解1. 裂缝 (Crack)2. 裂缝修补 (Crack Repair)3. 坑洞 (Pothole)4. 坑洞修补 (Pothole Repair)5. 井盖 (Manhole Cover)6. 其他 (Other) 三、标注工具四、下载地址 一、数据集概述 1. 行业痛点…...
AllData数据中台升级发布 | 支持K8S数据平台2.0版本
🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨杭州奥零数据科技官网…...
第二十二: go与k8s、docker相关编写dockerfile
实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布-CSDN博客 go 编写k8s命令: 怎么在go语言中编写k8s命令 • Worktile社区 k8s中如何使用go 在K8s编程中如何使用Go-阿里云开发者社区 go build - o : -o:指定输出文件…...
Python及C++中的字典
一、Python中的字典 (一)基本概念 字典(dict)是Python中一种可变容器模型,用于存储键值对(key:value)。字典的键必须是不可变类型(如字符串、数字或元组),而…...
.net Core 和 .net freamwork 调用 deepseek api 使用流输出文本(对话补全)
.net Core 调用 deepseek api 使用流输出文本 简下面直接上代码(.net core):最后再贴一个 .net Freamwork 4 可以用的代码TLS 的代码至关重要的:(下面这个) 简 在官网里面有许多的案例:我们通过…...
[特殊字符] 第十三讲 | 地统计模拟与空间不确定性评估
📘 专栏:科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者:平常心0715 🎯 关键词:地统计模拟、随机函数、空间不确定性、条件模拟、SGS、R语言 🧠 核心导语 在现实数据有限、空间异质性强的…...
springcloud整理
问题1.服务拆分后如何进行服务之间的调用 我们该如何跨服务调用,准确的说,如何在cart-service中获取item-service服务中的提供的商品数据呢? 解决办法:Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请…...
04-算法打卡-数组-二分查找-leetcode(69)-第四天
1 题目地址 69. x 的平方根 - 力扣(LeetCode)69. x 的平方根 - 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内…...
[Windows] 字体渲染 mactype v2025.4.11
[Windows] 字体渲染 mactype 链接:https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可变字体支持已到来。 本版本将可变字体支持扩展到所有 GDI 应用程序。 所有 win32 程序中的字体,如 Noto Sans、Se…...
VSCode CMake调试CPP程序
文章目录 1 安装C与CMake插件2 配置CMakeLists.txt3 使用CMake编译调试3.1 编译3.2 调试 4 自定义构建调试参考 1 安装C与CMake插件 C插件 CMake插件 2 配置CMakeLists.txt 编写测试程序 #include<iostream>int main(int argc, char const *argv[]) {int a 1, b 2;i…...
MySQL数据过滤、转换与标准化
数据处理是数据库操作的重要组成部分,尤其是在大量数据中查找、转换和规范化目标信息的过程中。为了确保数据的有效性与一致性,MySQL提供了一系列数据过滤、转换与标准化的功能。 本教程将深入探讨数据过滤和转换的基本方法及应用,内容涵盖数…...
Halo 设置 GitHub - OAuth2 认证指南
在当今数字化时代,用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言,引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天,我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…...
【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller
注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——Animator动画】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、状态机复用是什么?二、实战专栏推荐完结 一、状态机复…...
C语言--汉诺塔问题
汉诺塔问题是一个典型的递归问题。 递归问题的基本思想:将问题逐步化简为相同思路但是规模更小的问题,直到问题可以直接解决 递归的关键在于基准情形和递归步骤,基准情形也就是退出条件,递归步骤也就是把问题简化为子问题的过程。…...
301.找出3位偶数
2094. 找出 3 位偶数 - 力扣(LeetCode) class Solution {List<Integer> resnew ArrayList<>();List<Integer> linew ArrayList<>();public int[] findEvenNumbers(int[] digits) {Arrays.sort(digits);boolean[] numsnew boolea…...
使用Python从零开始构建端到端文本到图像 Transformer大模型
简介:通过特征向量从文本生成图像 回顾:多模态 Transformer 在使用Python从零实现一个端到端多模态 Transformer大模型中,我们调整了字符级 Transformer 以处理图像(通过 ResNet 特征)和文本提示,用于视觉…...
comfyui点击执行没反应一例
以前只遇到过执行工作流时出错的情况,从没试过说点了执行后一点反应都没有的情况。 今天下载 蓝色多脑盒《一键同时换头、换脸、发型、发色之双pulid技巧》分享的工作,第一次发现点击执行没反应。 发现左下角的地方连接错乱了。 更正连接后工作流能正常…...
