Node.js中文件系统fs模块的使用及常用接口

fs是filesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。但是,这个模块几乎对所有操作提供异步和同步两种操作方式,供开发者选择。

JavaScript 的是没有操作文件的能力,但是 Node 是可以做到的,Node 提供了操作文件系统模块,是 Node 中使用非常重要和高频的模块,是绝对要掌握的一个模块系统。

fs 模块提供了非常多的接口,这里主要说一下一些常用的接口。

1.常用API快速复习

fs.stat 检测是文件还是目录

const fs = require('fs')
fs.stat('hello.js', (error,stats)=>{
 if(error) {
 console.log(error)
 } else {
 console.log(stats)
 console.log(`文件:${stats.isFile()}`)
 console.log(`目录:${stats.isDirectory()}`)
 }
})

fs.mkdir 创建目录

const fs = require('fs')
fs.mkdir('logs', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('目录创建成功!')
 }
})

fs.rmdir 删除目录

const fs = require('fs')
fs.rmdir('logs', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('成功删除了目录 logs')
 }
})

fs.writeFile 创建写入文件

const fs = require('fs')
fs.writeFile('logs/hello.log','您好~\n', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('成功写入文件');
 }
})

fs.appendFile 追加文件

const fs = require('fs')
fs.appendFile('logs/hello.log','hello~\n', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('成功写入文件');
 }
})

fs.readFile 读取文件

const fs = require('fs')
fs.readFile('logs/hello.log','utf-8', (error, data) => {
 if(error) {
 console.log(error)
 } else {
 console.log(data);
 }
})

fs.unlink 删除文件

const fs = require('fs')
fs.unlink(`logs/${file}`, error => {
 if(error) {
 console.log(error)
 } else {
 console.log(`成功删除了文件: ${file}`)
 }
})

fs.readdir 读取目录

const fs = require('fs')
fs.readdir('logs', (error, files) => {
 if(error) {
 console.log(error)
 } else {
 console.log(files);
 }
})

fs.rename 重命名,还可以更改文件的存放路径

const fs = require('fs')
fs.rename('js/hello.log', 'js/greeting.log', error => {
 if(error) {
 console.log(error)
 } else {
 console.log('重命名成功')
 }
})

2.第三方NPM包 mkdirp 的使用

mkdirp 不仅可以创建文件夹,还可以创建多层的文件夹,类似 mkdir -p 命令

midir -p tmp/foo/bar/baz

上述命令也可以在当前目录创建多层几文件夹。

如下代码在当前目录生成多层级文件夹

const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made => console.log(`创建目录于: ${made}`))
// 创建目录于: /Users/zhangbing/github/CodeTest/Node/fs/tmp

结果

3.实战举例

实战1

判断服务器上面有没有 upload 目录。如果没有就创建这个目录,如果有的话不做操作

const fs = require('fs')

const path = './upload'
fs.stat(path, (err, data) => {
 if(err) {
 // 执行创建目录
 mkdir(path)
 return
 }
 if(data.isDirectory()) {
 console.log('upload目录存在');
 }else{
 // 首先删除文件,再去执行创建目录
 fs.unlink(path, err => {
  if(!err) {
  mkdir(path)
  }
 })
 }
})

function mkdir(dir) {
 fs.mkdir(dir, err => {
 if(err) {
  console.log(err);
  return
 }
 })
}

实战2

wwwroot 文件夹下面有 images css js 以及 index.html, 找出 wwwroot 目录下面的所有的目录,然后放在一个数组中

使用同步方法方式

const fs = require('fs')
const path = './wwwroot'
const dirArr = []

const dirs = fs.readdirSync(path)
dirs.forEach(item => {
 if(fs.statSync(path + '/' + item).isDirectory()) {
 dirArr.push(item)
 }
})
console.log('dirArr', dirArr)
// dirArr [ 'css', 'images', 'js' ]

使用 async/await 方式

const fs = require('fs')
const path = './wwwroot'
const dirArr = []

function isDir(path) {
 return new Promise((resolve, reject) => {
 fs.stat(path, (error, stats) => {
  if(error) {
  console.log(error)
  reject(error)
  return
  }
  if(stats.isDirectory()) {
  resolve(true)
  } else {
  resolve(false)
  }
 })
 })
}

function main(){
 fs.readdir(path, async (error, data) => {
 if(error) {
  console.log(error)
  return
 } else {
  for(let i = 0; i < data.length; i++) {
  if(await isDir(path + '/' + data[i])) {
   dirArr.push(data[i])
  }
  }
  console.log('dirArr', dirArr)
 }
 })
}

main() // dirArr [ 'css', 'images', 'js' ]

4.管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

const fs = require("fs")
//创建一个可读流
const readerStream = fs.createReadStream('input.txt')
//创建一个可写流
const writerStream = fs.createWriteStream('output.txt')
//管道读写操作
//读取input.txt文件内容,并将内容写入到output.txt文件中
readerStream.pipe(writerStream)
console.log("程序执行完毕")
fs.createReadStream 从文件流中读取数据
const fs = require('fs')
const fileReadStream = fs.fileReadStream('demo1.js')
let count = 0
let str = ''
fileReadStream.on('data', chunk => {
 console.log(`${++count}接收到:${chunk.length}`)
 str += chunk
})
fileReadStream.on('end', () => {
 console.log('---结束---')
 console.log(count + ',' + star)
})
fileReadStream.on('error', error => {
 console.log(error)
})
fs.createWriteStream 写入文件
const fs = require("fs")
const data ='我是从数据库获取的数据,我要保存起来'
//创建一个可以写入的流,写入到文件output.txt中
const writerStream = fs.createWriteStream('output.txt')
//使用utf8编码写入数据
writerStream.write(data,'UTF8')
//标记文件末尾
writerStream.end()
//处理流事件-->finish事件
writerStream.on('finish', () => {
 /*finish-所有数据已被写入到底层系统时触发。*/
 console.log("写入完成。")
})
writerStream.on('error', err => {
 console.log(err.stack);
})
console.log("程序执行完毕")

实战:复制图片在项目根目录有一张图片 2020.png ,把它复制到 /wwwroot/images 中

代码如下

const fs = require("fs")

const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./wwwroot/images/2021.png')

readStream.pipe(writeStream)

需要特别注意的是, fs.createWriteStream 要写入的目录一定要带上要复制的文件名,也就是不能写成 fs.createWriteStream('./wwwroot/images/') 否则在 macOS 下会报如下错误:

Error: EISDIR: illegal operation on a directory, open <directory>

本文源码: https://github.com/dunizb/CodeTest/tree/master/Node/fs

总结

到此这篇关于Node.js中fs模块的使用及常用接口的文章就介绍到这了,更多相关node.js fs 模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于node.js的fs核心模块读写文件操作(实例讲解)

    node.js 里fs模块 常用的功能 实现文件的读写 目录的操作 - 同步和异步共存 ,有异步不用同步 - fs.readFile 都不能读取比运行内存大的文件,如果文件偏大也不会使用readFile方法 - 文件大分流读取,stream - 引入fs模块 - let fs=require('fs') 同步读取文件 -fs.readFileSync('路径',utf8); let result=fs.readFileSync('./1.txt','utf8'); 异步读取文件,用参数err捕获

  • Node.js学习之内置模块fs用法示例

    本文实例讲述了Node.js学习之内置模块fs用法.分享给大家供大家参考,具体如下: IDE为VSCode .js内置的fs模块就是文件系统模块,负责读写文件 'use strict' var fs = require('fs'); //异步读取文件(文本)编码格式指定为utf-8 fs.readFile('sample.txt','utf-8',function(error,data){ if(error){ console.log('error'); }else{ console.log(d

  • Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法

    fs模块.js: /* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创建目录) 4. fs.appendFile 写入追加文件 5.fs.readFile 读取文件 6.fs.readdir 读取目录 7.fs.rename 重命名 8. fs.rmdir 删除目录 9. fs.unlink 删除文件 */ var fs=require('fs');

  • 浅谈Node.js:fs文件系统模块

    fs文件系统模块,这是一个非常重要的模块,对文件的操作都基于它.该模块的所有方法都有同步和异步两种方式,下面便介绍一下该模块的使用. 1.检测当前进程对文件的权限 使用fs.access(path[, mode], callback)方法检查权限,mode参数是一个整数,有以下常量值: fs.constants.F_OK     path对调用进程是可见的,既存在 fs.constants.R_OK     path是可读的 fs.constants.W_OK    path是可写的 fs.co

  • node.js中fs文件系统模块的使用方法实例详解

    本文实例讲述了node.js中fs文件系统模块的使用方法.分享给大家供大家参考,具体如下: node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法为异步方法. 一.文件的整个读取 const fs = require('fs'); //参数一表示读取的文件 //参数二表示读取的配置,{encoding:'null', flag:'r'} //encod

  • node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    本文实例讲述了node.js基于fs模块对系统文件及目录进行读写操作的方法.分享给大家供大家参考,具体如下: 如果要用这个模块,首先需要引入,fs已经属于node.js自带的模块,所以直接引入即可 var fs = require('fs'); 1.读取文件readFile方法使用 fs.readFile(filename,[option],callback) 方法读取文件. 参数说明: filename String 文件名 option Object   encoding String |n

  • Node.js中文件系统fs模块的使用及常用接口

    fs是filesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装.但是,这个模块几乎对所有操作提供异步和同步两种操作方式,供开发者选择. JavaScript 的是没有操作文件的能力,但是 Node 是可以做到的,Node 提供了操作文件系统模块,是 Node 中使用非常重要和高频的模块,是绝对要掌握的一个模块系统. fs 模块提供了非常多的接口,这里主要说一下一些常用的接口. 1.常用API快速复习 fs.stat 检测是文件还是目录 const fs

  • Node.js 中的 fs 模块与Path模块方法详解

    概述: 文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集.可以通过调用 require("fs") 来获取该模块.文件系统模块中的所有方法均有异步和同步版本. 文件系统模块中的异步方法需要一个完成时的回调函数作为最后一个传入形参. 回调函数的构成由调用的异步方法所决定,通常情况下回调函数的第一个形参为返回的错误信息. 如果异步操作执行正确并返回,该错误形参则为null或者undefined.如果使用的是同步版本的操作方法,一旦出现错误,会以通常的抛出错误的形式返回

  • node.js中path路径模块的使用方法实例分析

    本文实例讲述了node.js中path路径模块的使用方法.分享给大家供大家参考,具体如下: path模块是node.js中处理路径的核心模块.可以很方便的处理关于文件路径的问题. join() 将多个参数值合并成一个路径 const path = require('path'); console.log(path.join('./a', 'b', 'c')); basename() 获取路径中的文件名 const path = require('path'); //获取文件名,包含扩展名 con

  • Node.js中SerialPort(串口)模块使用

    目录 目的 模块安装 基础使用 扫描端口 打开端口 发送数据 接收数据 错误处理 数据解析器 SerialPort类 构造方法 属性 事件 方法 命令行工具 总结 目的 上位机与各种电路模块间常常采用串口进行通讯,Node.js中可以使用SerialPort模块操作串口,这篇文章将对其使用进行简单说明. 官网:https://serialport.io/ 文档:https://serialport.io/docs/ 项目地址:https://github.com/serialport/node-

  • Node.js中对通用模块的封装方法

    在Node.js中对模块载入和执行进行了包装,使得模块文件中的变量在一个闭包中,不会污染全局变量,和他人冲突. 前端模块通常是我们开发人员为了避免和他人冲突才把模块代码放置在一个闭包中. 如何封装Node.js和前端通用的模块,我们可以参考Underscore.js 实现,他就是一个Node.js和前端通用的功能函数模块,查看代码: 复制代码 代码如下: // Create a safe reference to the Underscore object for use below.  var

  • Node.js中路径处理模块path详解

    前言 在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了.下面我们就来详细介绍下关于Node.js中的路径处理模块path. 获取路径/文件名/扩展名 获取路径:path.dirname(filepath) 获取文件名:path.basename(filepath) 获取扩展名:path.extname(filepath) 获取所在路径 例子如下: var path = re

  • Node.js中的child_process模块详解

    前言 本文主要给大家介绍了关于Node.js中child_process模块的相关内容,在介绍child_process模块之前,先来看一个例子. const http = require('http'); const longComputation = () => { let sum = 0; for (let i = 0; i < 1e10; i++) { sum += i; }; return sum; }; const server = http.createServer(); ser

  • 使用node.JS中的url模块解析URL信息

    在HTTP部分,详细介绍了URL的相关知识.而nodejs中的url模块提供了一些实用函数,用于URL处理与解析. 解析URL 解析 URL 对象有以下内容,依赖于他们是否在 URL 字符串里存在.任何不在 URL 字符串里的部分,都不会出现在解析对象里 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash' ┌──────────────────────────────────────────────────────────────

  • Node.js中的HTTP模块与URL模块

    几乎每门编程语言都会包括网络这块,Node.js也不例外.今天主要是熟悉下Node.js中HTTP服务.其实HTTP模块是相当低层次的,它不提供路由.cookie.缓存等,像Web开发中不会直接使用,但还是要熟悉下,这样也方便以后的学习. 统一资源标识符URL 这个是非常常见的,在Node.js中有几种处理. http://user:pass@host.com:80/resource/path/?query=string#hash 协议://身份认证@主机名.com:端口/路径/搜索/查询#散列

  • Node.js中文件操作模块File System的详细介绍

    File System的缩写是fs,该模块提供本地文件的读写能力. Nodejs导入文件系统模块(fs)语法如下所示: var fs = require("fs"); 异步和同步 Node.js文件系统(fs模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error).同步则没有回调函数. 建议大家是用异步方法,比起同步

随机推荐