Node.js中fs模块详解

news2025/4/13 8:09:15

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。

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

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

相关文章

特殊定制版,太给力了!

今天给大家分享一款超棒的免费录屏软件,真的是录屏的好帮手! 这款软件功能可以录制 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家代理商,实…

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年的今天&#xff0c;人工智能已从技术概念全面渗透至产业核心。中国作为全球AI技术应用的前沿阵地&#xff0c;正通过“人工智能”行动加速推进技术与实体经济深度融合。 这一背景下&#xff0c;永洪科技凭借其“国内某头部ICT人力资源板块GenAI项目”荣获“2025全国企业…

基于疾风大模型的新能源储能优化系统:方法、实现与案例分析

一、引言 随着可再生能源渗透率不断提高,储能系统在电力系统中的重要性日益凸显。传统储能控制方法主要基于规则策略和简单优化算法,难以应对高比例新能源场景下的复杂决策需求。本文将详细介绍如何利用疾风大模型(Gale Model)构建智能化的新能源储能优化系统,包含核心方…

菊风RTC 2.0 开发者文档正式发布,解锁音视频新体验!

重磅发布&#xff01; 开发者们&#xff0c;菊风实时音视频2.0文档已正式发布上线&#xff0c;为您提供更清晰、更高效的开发支持&#xff01;让菊风实时音视频2.0为您的音视频应用加速~ 菊风实时音视频2.0聚焦性能升级、体验升级、录制服务升级&#xff0c;助力视频通话、语…

OpenCv高阶(一)——图像金字塔(上采样、下采样)

目录 图像金字塔 一、上下采样原理 1、向下取样 2、向上采样 3、图像金字塔的作用 二、案例实现 1、高斯下采样 2、高斯金字塔中的上采样 3、对下采样的结果做上采样&#xff0c;图像变模糊&#xff0c;无法复原 4、拉普拉斯金字塔&#xff08;图片复原&#xff09; 图…

LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】

LEARNING DYNAMICS OF LLM FINETUNING 一句话总结 作者将LLM的学习动力机制拆解成AKG三项&#xff0c;并分别观察了SFT和DPO训练过程中​​正梯度信号​​和​​负梯度信号​​的变化及其带来的影响&#xff0c;并得到以下结论&#xff1a; ​​SFT通过梯度相似性间接提升无关…

数据集 | 沥青路面缺陷目标检测

文章目录 一、数据集概述1. 行业痛点与数据集价值2. 数据集技术规格 二、样本类别详解1. 裂缝 (Crack)2. 裂缝修补 (Crack Repair)3. 坑洞 (Pothole)4. 坑洞修补 (Pothole Repair)5. 井盖 (Manhole Cover)6. 其他 (Other) 三、标注工具四、下载地址 一、数据集概述 1. 行业痛点…

AllData数据中台升级发布 | 支持K8S数据平台2.0版本

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xf…

.net Core 和 .net freamwork 调用 deepseek api 使用流输出文本(对话补全)

.net Core 调用 deepseek api 使用流输出文本 简下面直接上代码&#xff08;.net core&#xff09;&#xff1a;最后再贴一个 .net Freamwork 4 可以用的代码TLS 的代码至关重要的&#xff1a;&#xff08;下面这个&#xff09; 简 在官网里面有许多的案例&#xff1a;我们通过…

springcloud整理

问题1.服务拆分后如何进行服务之间的调用 我们该如何跨服务调用&#xff0c;准确的说&#xff0c;如何在cart-service中获取item-service服务中的提供的商品数据呢&#xff1f; 解决办法&#xff1a;Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请…

04-算法打卡-数组-二分查找-leetcode(69)-第四天

1 题目地址 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09;69. x 的平方根 - 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。注意&#xff1a;不允许使用任何内…

[Windows] 字体渲染 mactype v2025.4.11

[Windows] 字体渲染 mactype 链接&#xff1a;https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可变字体支持已到来。 本版本将可变字体支持扩展到所有 GDI 应用程序。 所有 win32 程序中的字体&#xff0c;如 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…

Halo 设置 GitHub - OAuth2 认证指南

在当今数字化时代&#xff0c;用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言&#xff0c;引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天&#xff0c;我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…

【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——Animator动画】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、状态机复用是什么&#xff1f;二、实战专栏推荐完结 一、状态机复…

C语言--汉诺塔问题

汉诺塔问题是一个典型的递归问题。 递归问题的基本思想&#xff1a;将问题逐步化简为相同思路但是规模更小的问题&#xff0c;直到问题可以直接解决 递归的关键在于基准情形和递归步骤&#xff0c;基准情形也就是退出条件&#xff0c;递归步骤也就是把问题简化为子问题的过程。…