目录
  1. 1. 文件系统
    1. 1.1. 文件写入
      1. 1.1.1. 同步和异步的调用
        1. 1.1.1.1. 同步文件的写入
        2. 1.1.1.2. 异步文件的写入
      2. 1.1.2. 同步与异步的区别
      3. 1.1.3. 简单文件写入
      4. 1.1.4. 流式文件写入
    2. 1.2. 文件读取
      1. 1.2.1. 简单文件读取
      2. 1.2.2. 流式文件读取
    3. 1.3. Fs中的其他方法
      1. 1.3.1. 检查文件是否存在
      2. 1.3.2. 获取文件的状态
      3. 1.3.3. 删除文件
      4. 1.3.4. 列出文件
      5. 1.3.5. 截断文件
      6. 1.3.6. 建立目录
      7. 1.3.7. 删除目录
      8. 1.3.8. 重命名文件和目录
      9. 1.3.9. 监视文件
快速了解Node.JS中的文件系统

文件系统

文件写入

需要引入模块

var fs = require("fs");

同步和异步的调用

  • fs模块中所有的操作都有两种形式可供选择同步异步
  • 同步文件系统会阻塞程序的执行,也就是 除非操作完毕,否则不会向下执行代码。
  • 异步文件系统不会阻塞程序的执行,而是 在操作完成时,通过回调函数将结果返回。

同步文件的写入

  1. 打开文件

fs.openSync(path, flags[, mode])

  • path 要打开文件的路径
  • flags 打开文件要做的操作的类型
    • r 只读的
    • w 可写
  • mode 设置文件的操作权限,一般不传
  1. 写入文件

fs.writeSync(fd, string[, position[, encoding]])

  • fd 文件的描述符,需要传递要写入的文件的描述符
  • string 要写入的内容
  • position 写入的起始位置
  • encoding 写入的编码,默认utf-8
  1. 关闭文件

fs.closeSync(文件标识符);

// 引入文件系统模块
var fs = require("fs");
//打开文件
var foo = fs.openSync("hellword.txt","w")
//向文件中写入内容
fs.writeSync(foo,"我写了一个内容在里面")
//关闭文件
fs.closeSync(foo);

异步文件的写入

  1. 打开文件

fs.open(path, flags[, mode], callback)

  • path 要打开文件的路径
  • flags 打开文件要做的操作的类型
    • r 只读的
    • w 可写
  • callback 回调函数
  • 异步调用的方法,结果都是通过回调函数的参数返回的
  • 回调函数两个参数:
    • err 错误对象,如果没有错误则为null
    • fd 文件的描述符
  1. 写入文件

fs.write(fd, string[, position[, encoding]], callback)

  • 用来异步写入一个文件
  • fd 文件的描述符,需要传递要写入的文件的描述符
  • string 要写入的内容
  • position 写入的起始位置
  • callback 回调函数
  • 回调函数三个参数:
    • err 错误对象,如果没有错误则为null
    • written 写入多少字节
    • string 写入的内容
  1. 关闭文件

fs.close(fd, callback)

  • 用来关闭文件
//引入fs模块
var fs = require("fs");

//打开文件
fs.open("yb.txt","w",function (err , fd) {
// 判断文件是否出错
if(!err){
// 写入文件
fs.write(fd,"异步写入值...",function(err){
if(!err)
console.log("写入成功")
// 关闭文件
fs.close(fd,function(err){
if(!err)
console.log("文件已关闭")
})
})

}else{
console.log(err)
}
});

同步与异步的区别

  • 同步文件系统会阻塞程序的执行,也就是 除非操作完毕,否则不会向下执行代码。
  • 异步文件系统不会阻塞程序的执行,而是 在操作完成时,通过回调函数将结果返回。

简单文件写入

  • fs.writeFile(file, data[, options], callback)
  • fs.writeFileSync(file, data[, options])
    • - file 要操作的文件的路径
    • data 要写入的数据
    • options 选项,可以对写入进行一些设置
      • encoding 设置编码
      • mode 文件权限
      • flag
        • r 只读
        • w 可写
        • a 追加
    • callback 当写入完成以后执行的函数
//引入fs模块
var fs = require("fs");

// 异步
fs.writeFile("hello3.txt","这是通过writeFile写入的内容", function (err) {
if(!err){
console.log("写入成功~~~");
}else{
console.log(err);
}
});
// 追加
fs.writeFile("hello3.txt","这是通过writeFile写入的内容",{flag:"a+"}, function (err) {
if(!err){
console.log("写入成功~~~");
}else{
console.log(err);
}
});
// 同步
fs.writeFileSync("ybb.txt","这是同步写入进去的")

// 绝对路径写入
fs.writeFile("C:/Users/Damon/Desktop/hello.txt","这是通过writeFile写入的内容",{flag:"w"} , function (err) {
if(!err){
console.log("写入成功~~~");
}else{
console.log(err);
}
});

流式文件写入

  • 同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

  • 流式文件写入可以解决大文件写入问题

  1. 创建一个可写流

var ws = fs.createWriteStream(path[, options])

  • 可以用来创建一个可写流
  • path,文件路径
  • options 配置的参数
  1. 写入内容

.write(string)

通过ws.write(string)向文件中输出内容

  1. 关闭流

end()

通过ws.end()关闭流

  1. 监听流

可以通过监听流的openclose事件来监听流的打开和关闭

  • on(事件字符串,回调函数)
    • 可以为对象绑定一个事件
  • once(事件字符串,回调函数)
    • 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效

文件读取

1.同步文件读取 上同

2.异步文件读取 上同

3.简单文件读取

4.流式文件读取

简单文件读取

文件的读取(包括文本文件、图片、音频文件)

返回值 data 为buffer

var fs = require("fs");

fs.readFile("hellword.txt",function(err, data){
if(!err){
// 返回的一个Buffer,因为可能文件格式不一样,不一定是文本文件
// 如果读的文本文件,使用tostring()转化即可
console.log(data.toString())
}
})

文件的复制 (包括文本文件、图片、音频文件)

var fs = require("fs");

// 复制图片
fs.readFile("an.jpg",function(err, data){
if(!err){
fs.writeFile("fz.jpg",data,function(err, data){
if(!err)
console.log("文件复制成功")
})
}
})
// 复制音频
fs.readFile("a.mp3",function(err, data){
if(!err){
fs.writeFile("b.mp3",data,function(err, data){
if(!err)
console.log("文件复制成功")
})
}
})

流式文件读取

流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中

文件的读取

var fs = require("fs");

//创建一个可读流
var rs = fs.createReadStream("hellword.txt") // 会根据此处文件大小而改变文件的读写次数

//监听流的开启和关闭
rs.once("open",function(){
console.log("打开可读流")
})
rs.once("close",function(){
console.log("关闭可读流")
})


// 如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data",function(data){
console.log(data.toString())
})

文件的复制


var fs = require("fs");

//创建一个可读流

var rs = fs.createReadStream("b.mp3")
var ws = fs.createWriteStream("fz.mp3")
//监听流的开启和关闭
rs.once("open",function(){
console.log("打开可读流")
})
rs.once("close",function(){
console.log("关闭可读流")
ws.end() //记住一定在关闭可读流后关闭可写流
})

ws.once("open",function(){
console.log("打开可写流")
})
ws.once("close",function(){
console.log("关闭可写流")
})


// 如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件
// data事件绑定完毕,它会自动开始读取数据
rs.on("data",function(data){
console.log(data)
ws.write(data)

})

感觉上面方法太复杂了,换一个简单一点的方式来搞定

  • pipe()可以将可读流中的内容,直接输出到可写流中
var fs = require("fs");

//创建一个可读流
var rs = fs.createReadStream("b.mp3");
//创建一个可写流
var ws = fs.createWriteStream("pipe.mp3");

//pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);

监听可以根据自行去添加

Fs中的其他方法

检查文件是否存在

fs.existsSync(path) 检查一个文件是否存在

>// 返回值 true / false
>var isExists = fs.existsSync("a.mp3")

获取文件的状态

  • fs.stat(path, callback)

  • fs.statSync(path)

>// 返回文件的许多信息
>fs.stat("a.mp3", function(err, stat){
console.log(stat)
>})

删除文件

  • fs.unlink(path, callback)
  • fs.unlinkSync(path)
>// 删除文件
>fs.unlinkSync("hello.txt")

列出文件

  • fs.readdir(path[, options], callback)
  • fs.readdirSync(path[, options])
fs.readdir(".", function(er ,files){
if(!err)
console.log(files)
})

截断文件

  • fs.truncate(path, len, callback)
  • fs.truncateSync(path, len)

将文件修改为指定的大小

>fs.truncateSync("hello.txt",10)

建立目录

  • fs.mkdir(path[, mode], callback)
  • fs.mkdirSync(path[, mode])

创建目录

fs.mkdirSync("office")

删除目录

  • fs.rmdir(path, callback)
  • fs.rmdirSync(path)
fs.rmdirSync("office")

重命名文件和目录

  • fs.rename(oldPath, newPath, callback)
  • fs.renameSync(oldPath, newPath)
    • 参数
      • oldpath 旧的路径
      • newpath 新的路径
      • callback 回调函数

重命名

fs.rename("hello.txt","hh.txt", function(err){
if(!err)
console.log("重命名成功")
})

剪切/移动

fs.rename("hello.txt","C:/Temp/hello.txt", function(err){
if(!err)
console.log("移动成功")
})

监视文件

  • fs.watchFile(filename[, options], listener)
    • 参数
      • filename 要监视的文件的名字
      • options 配置选项
      • listener 回调函数,当文件发生变化时,回调函数执行
        • 参数,两个对象都是stats对象
          • curr 当前文件状态
          • prev 修改文件的状态
fs.watchFile("hello.txt",function(curr, prev){
console.log("修改前文件大小:"+ prev.size)
console.log("修改后文件大小:"+ curr.size)
})
文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-05/30/%E5%AD%A6%E4%B9%A0/%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0/NodeJS/%E5%BF%AB%E9%80%9F%E4%BA%86%E8%A7%A3Node.JS%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论