快速了解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)
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章