[node] Node.js的文件系统

[node] Node.js的文件系统

  • 文件系统的使用
  • 异步和同步
    • input.txt
    • 示例
  • 常用方法
    • 打开文件
      • 语法
      • 示例
    • 获取文件信息
      • 语法
      • 示例
    • 写入文件
      • 语法
      • 示例
    • 读取文件
      • 语法
      • 示例
    • 关闭文件
      • 语法
      • 示例
    • 截取文件
      • 语法
      • 示例
    • 删除文件
      • 语法
      • 示例
    • 创建目录
      • 语法
      • 示例
    • 读取目录
      • 语法
      • 示例
    • 删除目录
      • 语法
      • 示例
  • 文件模块方法

Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API

文件系统的使用

Node 导入文件系统模块(fs)语法如下:

var fs = require("fs")

异步和同步

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

input.txt

文件读取实例

示例

main.js

var fs = require("fs");
fs.readFile('input.txt', function (err, data) {// 异步读取
   if (err) {
       return console.error(err);
   }
   console.log("异步读取: " + data.toString());
});
var data = fs.readFileSync('input.txt');// 同步读取
console.log("同步读取: " + data.toString());
console.log("程序执行完毕。");
//终端执行 node main.js
//输出
// 同步读取: Test for read

// 程序执行完毕。
// 异步读取: Test for read

常用方法

打开文件

语法

异步模式下打开文件:

fs.open(path, flags[, mode], callback)
  • path - 文件的路径。
  • flags - 文件打开的行为。标志说明看下表。
  • mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
  • callback - 回调函数,带有两个参数如:callback(err, fd)。

flags标志说明:

Flag描述
r以读取模式打开文件。如果文件不存在抛出异常。
r+以读写模式打开文件。如果文件不存在抛出异常。
rs以同步的方式读取文件。
rs+以同步的方式读取和写入文件。
w以写入模式打开文件,如果文件不存在则创建。
wx类似 ‘w’,但是如果文件路径存在,则文件写入失败。
w+以读写模式打开文件,如果文件不存在则创建。
wx+类似 ‘w+’, 但是如果文件路径存在,则文件读写失败。
a以追加模式打开文件,如果文件不存在则创建。
ax类似 ‘a’, 但是如果文件路径存在,则文件追加失败。
a+以读取追加模式打开文件,如果文件不存在则创建。
ax+类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。

示例

var fs = require("fs");
// 异步打开文件
console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!");     
});
//终端执行 node main.js
//输出
// 准备打开文件!
// 文件打开成功!

获取文件信息

语法

异步模式下获取文件信息:

fs.stat(path, callback)
  • path - 文件路径
  • callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象

stats类中的方法有:

方法描述
stats.isFile()如果是文件返回 true,否则返回 false
stats.isDirectory()如果是目录返回 true,否则返回 false
stats.isBlockDevice()如果是块设备返回 true,否则返回 false
stats.isCharacterDevice()如果是字符设备返回 true,否则返回 false
stats.isSymbolicLink()如果是软链接返回 true,否则返回 false
stats.isFIFO()如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道
stats.isSocket()如果是 Socket 返回 true,否则返回 false

示例

fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件

var fs = require('fs');
fs.stat('/demo/fs.js', function (err, stats) {
    console.log(stats.isFile());         //true
})

写入文件

语法

异步模式下写入文件语法格式:

fs.writeFile(file, data[, options], callback)

writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容

  • file - 文件名或文件描述符
  • data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象
  • options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’,这里flag的取值可以参考打开文件中flag的取值范围
  • callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回

示例

mian.js

var fs = require("fs");
console.log("准备写入文件");
fs.writeFile('input.txt', '通过fs.writeFile 写入文件的内容',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("数据写入成功!");
   console.log("--------分割线-------------")
   console.log("读取写入的数据!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("异步读取文件数据: " + data.toString());
   });
});
//终端执行 node main.js
//输出
// 准备写入文件
// 数据写入成功!
// --------分割线-------------
// 读取写入的数据!
// 异步读取文件数据: 通过fs.writeFile 写入文件的内容

读取文件

语法

异步模式下读取文件语法格式:

fs.read(fd, buffer, offset, length, position, callback)

该方法使用了文件描述符来读取文件

  • fd - 通过 fs.open() 方法返回的文件描述符
  • buffer - 数据写入的缓冲区
  • offset - 缓冲区写入的写入偏移量
  • length - 要从文件中读取的字节数
  • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取
  • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象

示例

mian.js

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  字节被读取");
      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});
//终端执行 node main.js
//txt文件内容是: 文件读取实例
//输出
// 准备打开已存在的文件!
// 文件打开成功!
// 准备读取文件:
// 20  字节被读取
// 文件读取实例

关闭文件

语法

异步模式下关闭文件语法格式:

fs.close(fd, callback)
  • fd - 通过 fs.open() 方法返回的文件描述符
  • callback - 回调函数,没有参数

示例

mian.js

var fs = require("fs");
var buf = new Buffer.alloc(1024);
console.log("准备打开文件!");
fs.open("input.txt", "r+", function (err, fd) {
  if (err) {
    return console.error(err);
  }
  console.log("文件打开成功!");
  console.log("准备读取文件!");
  fs.read(fd, buf, 0, buf.length, 0, function (err, bytes) {
    if (err) {
      console.log(err);
    }
    if (bytes > 0) {
      console.log(buf.slice(0, bytes).toString()); // 仅输出读取的字节
    }
    // 关闭文件
    fs.close(fd, function (err) {
      if (err) {
        console.log(err);
      }
      console.log("文件关闭成功");
    });
  });
});
//终端执行 node main.js
//输出
// 准备打开文件!
// 文件打开成功!
// 准备读取文件!
// 文件读取实例

// 文件关闭成功

截取文件

语法

异步模式下截取文件语法格式:

fs.ftruncate(fd, len, callback)
  • fd - 通过 fs.open() 方法返回的文件描述符
  • len - 文件内容截取的长度
  • callback - 回调函数,没有参数

示例

input.txt

Test for read or write!!!

mian.js

var fs = require("fs");
console.log("准备写入文件");
fs.writeFile('input.txt', '通过fs.writeFile 写入文件的内容',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("数据写入成功!");
   console.log("--------分割线-------------")
   console.log("读取写入的数据!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("异步读取文件数据: " + data.toString());
   });
});
//终端执行 node main.js
//输出
// 准备打开文件!
// 文件打开成功!
// 截取10字节内的文件内容,超出部分将被去除。
// 文件截取成功。
// 读取相同的文件
// Test for r
// 文件关闭成功!

删除文件

语法

删除文件语法格式:

fs.unlink(path, callback)
  • path - 文件路径
  • callback - 回调函数,没有参数

示例

mian.js

var fs = require("fs");
console.log("准备删除文件!");
fs.unlink("input.txt", function (err) {
  if (err) {
    return console.error(err);
  }
  console.log("文件删除成功!");
});
//终端执行 node main.js
//输出
// 准备删除文件!
// 文件删除成功!

此时 input.txt 文件已经不存在

创建目录

语法

异步模式下创建目录语法格式:

fs.mkdir(path[, options], callback)
  • path - 文件路径
  • options - 参数可以是:
    • recursive - 是否以递归的方式创建目录,默认 false
    • mode - 设置目录权限,默认为 0777
  • callback - 回调函数,没有参数

示例

mian.js

var fs = require("fs");

console.log("创建目录 /tmp/");
fs.mkdir("/tmp/", function (err) {
  if (err) {
    return console.error(err);
  }
  console.log("目录创建成功。");
});
//终端执行 node main.js
//输出
// 创建目录 /tmp/
// 目录创建成功。

若是创建的是嵌套的目录,例如"/temp/test/,必须保证上级目录temp存在,否则会导致报错

若是不存在上级目录而成功创建test,则需添加参数recursive,因为该参数用于控制是否递归创建目录:

fs.mkdir('/temp/test', { recursive: true }, (err) => {
  if (err) throw err;
});

读取目录

语法

异步模式下读取目录语法格式:

fs.readdir(path, callback)
  • path - 文件路径
  • callback - 回调函数,回调函数带有两个参数:
    • err 为错误信息
    • files 为 目录下的文件数组列表。

示例

mian.js

var fs = require("fs");
console.log("查看 /bin 目录");
fs.readdir("bin/", function (err, files) {
  if (err) {
    return console.error(err);
  }
  files.forEach(function (file) {
    console.log(file);
  });
});
//终端执行 node main.js
//输出
// 查看 /bin 目录
// index.js
// readme.md

删除目录

语法

删除目录语法格式:

fs.rmdir(path, callback)
  • path - 文件路径
  • callback - 回调函数,没有参数。

示例

mian.js

var fs = require("fs");
// 执行前创建一个空的 temp/test 目录
console.log("准备删除目录 temp/test");
fs.rmdir("temp/test", function (err) {
  if (err) {
    return console.error(err);
  }
  console.log("读取 temp 目录");
  fs.readdir("temp", function (err, files) {
    if (err) {
      return console.error(err);
    }
    files.forEach(function (file) {
      console.log(file);
    });
  });
});
//终端执行 node main.js
//输出
// 准备删除目录 temp/test
// 读取 temp 目录

文件模块方法

以下为 Node.js 文件模块的方法列表:

方法描述
fs.rename(oldPath, newPath, callback)异步 rename().回调函数没有参数,但可能抛出异常
fs.ftruncate(fd, len, callback)异步 ftruncate().回调函数没有参数,但可能抛出异常
fs.ftruncateSync(fd, len)同步 ftruncate()
fs.truncate(path, len, callback)异步 truncate().回调函数没有参数,但可能抛出异常。
fs.truncateSync(path, len)同步 truncate()
fs.chown(path, uid, gid, callback)异步 chown().回调函数没有参数,但可能抛出异常。
fs.chownSync(path, uid, gid)同步 chown()
fs.fchown(fd, uid, gid, callback)异步 fchown().回调函数没有参数,但可能抛出异常。
fs.fchownSync(fd, uid, gid)同步 fchown()
fs.lchown(path, uid, gid, callback)异步 lchown().回调函数没有参数,但可能抛出异常。
fs.lchownSync(path, uid, gid)同步 lchown()
fs.chmod(path, mode, callback)异步 chmod().回调函数没有参数,但可能抛出异常。
fs.chmodSync(path, mode)同步 chmod().
fs.fchmod(fd, mode, callback)异步 fchmod().回调函数没有参数,但可能抛出异常。
fs.fchmodSync(fd, mode)同步 fchmod().
fs.lchmod(path, mode, callback)异步 lchmod().回调函数没有参数,但可能抛出异常。Only available on Mac OS X.
fs.lchmodSync(path, mode)同步 lchmod().
fs.stat(path, callback)异步 stat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。
fs.lstat(path, callback)异步 lstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。
fs.fstat(fd, callback)异步 fstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。
fs.statSync(path)同步 stat(). 返回 fs.Stats 的实例。
fs.lstatSync(path)同步 lstat(). 返回 fs.Stats 的实例。
fs.fstatSync(fd)同步 fstat(). 返回 fs.Stats 的实例。
fs.link(srcpath, dstpath, callback)异步 link().回调函数没有参数,但可能抛出异常。
fs.linkSync(srcpath, dstpath)同步 link().
fs.symlink(srcpath, dstpath[, type], callback)异步 symlink().回调函数没有参数,但可能抛出异常。 type 参数可以设置为 ‘dir’, ‘file’, 或 ‘junction’ (默认为 ‘file’) 。
fs.symlinkSync(srcpath, dstpath[, type])同步 symlink().
fs.readlink(path, callback)异步 readlink(). 回调函数有两个参数 err, linkString。
fs.realpath(path[, cache], callback)异步 realpath(). 回调函数有两个参数 err, resolvedPath。
fs.realpathSync(path[, cache])同步 realpath()。返回绝对路径。
fs.unlink(path, callback)异步 unlink().回调函数没有参数,但可能抛出异常。
fs.unlinkSync(path)同步 unlink().
fs.rmdir(path, callback)异步 rmdir().回调函数没有参数,但可能抛出异常。
fs.rmdirSync(path)同步 rmdir().
fs.mkdir(path[, mode], callback)S异步 mkdir(2).回调函数没有参数,但可能抛出异常。 访问权限默认为 0777。
fs.mkdirSync(path[, mode])同步 mkdir().
fs.readdir(path, callback)异步 readdir(3). 读取目录的内容。
fs.readdirSync(path)同步 readdir().返回文件数组列表。
fs.close(fd, callback)异步 close().回调函数没有参数,但可能抛出异常。
fs.closeSync(fd)同步 close().
fs.open(path, flags[, mode], callback)异步打开文件。
fs.openSync(path, flags[, mode])同步 version of fs.open().
fs.utimes(path, atime, mtime, callback)异步修改指定路径path的文件时间戳
fs.utimesSync(path, atime, mtime)修改指定路径path的文件时间戳
fs.futimes(fd, atime, mtime, callback)异步修改文件时间戳,通过文件描述符指定
fs.futimesSync(fd, atime, mtime)修改文件时间戳,通过文件描述符指定。
fs.fsync(fd, callback)异步 fsync.回调函数没有参数,但可能抛出异常。
fs.fsyncSync(fd)同步 fsync.
fs.write(fd, buffer, offset, length[, position], callback)将缓冲区内容写入到通过文件描述符指定的文件。
fs.write(fd, data[, position[, encoding]], callback)通过文件描述符 fd 写入文件内容。
fs.writeSync(fd, buffer, offset, length[, position])同步版的 fs.write()。
fs.writeSync(fd, data[, position[, encoding]])同步版的 fs.write().
fs.read(fd, buffer, offset, length, position, callback)通过文件描述符 fd 读取文件内容。
fs.readSync(fd, buffer, offset, length, position)同步版的 fs.read.
fs.readFile(filename[, options], callback)异步读取文件内容。
fs.readFileSync(filename[, options])fs.writeFile(filename, data[, options], callback)
fs.writeFileSync(filename, data[, options])同步版的 fs.writeFile。
fs.appendFile(filename, data[, options], callback)异步追加文件内容。
fs.appendFileSync(filename, data[, options])The 同步 version of fs.appendFile.
fs.watchFile(filename[, options], listener)查看文件的修改。
fs.unwatchFile(filename[, listener])停止查看 filename 的修改。
fs.watch(filename[, options][, listener])查看 filename 的修改,filename 可以是文件或目录。返回 fs.FSWatcher 对象。
fs.exists(path, callback)检测给定的路径是否存在。
fs.existsSync(path)同步版的 fs.exists.
fs.access(path[, mode], callback)测试指定路径用户权限
fs.accessSync(path[, mode])同步版的 fs.access
fs.createReadStream(path[, options])返回ReadStream 对象
fs.createWriteStream(path[, options])返回 WriteStream 对象
fs.symlink(srcpath, dstpath[, type], callback)异步 symlink().回调函数没有参数,但可能抛出异常

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中vim中进行替换/批量替换

Linux中vim中进行替换/批量替换 一:在 Vim 中进行文本替换的操作是通过使用 :s(substitute)命令来实现的。这里是一些基本的替换命令 替换当前行的第一个匹配项: :s/old/new/这将替换当前行中第一个出现的 “old” 为 “new”。 替换当前行的所有匹配项…

工作实践篇 Flink(一:flink提交jar)

一:参数 flink 模式 – standalone 二:步骤 1. 将本地测试好的代码进行本地运行。确保没问题,进行打包。 2. 找到打好的jar包,将jar包上传到对应的服务器。 3. 执行flink命令,跑代码。 /opt/flink/flink-1.13.6/bi…

ASP.Net实现姓名添加查询(三层架构)

目录 演示功能: 点击启动生成页面 点击搜索模糊查询 点击添加跳转新界面 点击Button添加姓名 步骤: 1、建文件 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper(对数据库进行操作)…

轻量Http客户端工具VSCode和IDEA

文章目录 前言Visual Studio Code 的插件 REST Client编写第一个案例进阶,设置变量进阶,设置Token 前言 作为一个WEB工程师,在日常的使用过程中,HTTP请求是必不可少的。我们采用的HTTP工具有如下: Postman Insomnia Ap…

MyBatis见解3

8.MyBatis的关联查询 8.3.一对多查询 需求:查询所有用户信息及用户关联的账户信息。 分析:用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息查询出来,此时左外连接查询比…

Spring和Spring Boot框架中怎么理解Bean这个核心概念

在Spring和Spring Boot框架中,Bean是一个核心概念。要理解Spring Boot中的Bean,我们可以从以下几个方面进行: 定义: Bean是Spring框架中的一个对象,由Spring容器管理。当我们在应用程序中需要某个对象时,我…

Deepin更换仿Mac主题

上一篇博客说了要写一篇deepin系统的美化教程 先看效果图: 准备工作: 1.你自己 嘻嘻嘻 2.能上网的deepin15.11电脑 首先去下载主题 本次需要系统美化3部分:1.图标 2.光标 3.壁纸 开始之前,请先把你的窗口特效打开,…

华为设备命令行操作基础

熟悉VRP命令行并且熟练掌握VRP配置是高效管理华为网络设备的必备基础。 设备初始化启动 管理员和工程师如果要访问在通用路由平台VRP上运行的华为产品,首先要进入启动程序。开机界面信息提供了系统启动的运行程序和正在运行的VRP版本及其加载路径。启动完成以后&am…

spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言:本文不介绍 AOP 的基本概念、动态代理方式实现 AOP,以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP,也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…

【PHP手麻系统源码】基于mysql+laravel+vue开发的医院手术麻醉系统源码,实现围术期患者数据的自动采集与共享

手麻系统作为医院信息化系统的一环,由监护设备数据采集系统和麻醉信息管理系统两个子部分组成。手麻信息系统覆盖了患者术前、术中、术后的手术过程,可以实现麻醉信息的电子化和手术麻醉全过程动态跟踪。 以服务围术期临床业务工作的开展为核心&#xf…

分布式搜索elasticsearch概念

什么是elasticsearch? elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容 目录 elasticsearch的场景 elasticsearch的发展 Lucene篇 Elasticsearch篇 elasticsearch的安装 elasticsearch的场景 elasticsear…

BigQuery 分区表简介和使用

大纲 什么是分区表 我们先看定义: 分区表是一种数据库表设计和管理技术,它将表中的数据划分为逻辑上的多个分区,每个分区包含一组特定的数据。每个分区都根据定义的分区键(通常是一个列或字段)的值进行分类&#xff…

构建创新学习体验:企业培训系统技术深度解析

企业培训系统在现代企业中发挥着越来越重要的作用,它不仅仅是传统培训的延伸,更是技术创新的结晶。本文将深入探讨企业培训系统的关键技术特点,并通过一些简单的代码示例,展示如何在实际项目中应用这些技术。 1. 前端技术&#…

SLAM算法与工程实践——雷达篇:Livox激光雷达使用

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

微信小程序格创校园跑腿小程序源码v1.1.64+前端

简介: 版本号:1.1.64 – 多学校版本 本次更新内容: 订单问题修复 (无需上传小程序) 版本号:1.1.63 – 多学校版本 本次更新内容: 失物招领增加内容安全接口; 认证增加性别选…

freeswitch on debian docker

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 因为centos系统期限的原因,尝试在debian的docker上使用fs。 环境 docker engine:Version 24.0.6 debian docker:bullseye 11.8 freeswitch:v1.10.7 Debian准备 目前…

有待写入光盘的文件处理办法

windows11系统中 dvd盘中拖入文件后,文件未写入,信息提示有待写入光盘的文件 处理办法: 同时按住shift鼠标右键,点击光盘图标: 选择刻录到光盘 点击下一步 选择重新刻录 反复几次发现无法完成。 最后处理办法&…

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据,但还需要给用户去创建账号允许他们登录后才能看展示得数据,那有什么办法让非管理员更方便得去访问Grafana呢?下面介绍两个比较方便实现的: 在开始设置前&#xff…

FastAPI实现文件上传下载

FastAPI实现文件上传下载 1.后端FastAPI2.后端html3.效果 最近的项目需求,是前端vue,后端fastAPI,然后涉及到图像的消息发送,所以需要用fast写文件上传下载的接口,这里简单记录一下。 1.后端FastAPI import os.path i…

C++的面向对象学习(5):对象的重要特性:对象的成员变量和成员函数深入研究

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、static修饰的静态成员:与类本身关联,不依赖于任何对象。①静态成员变量:②静态成员函数:(1&#xff…