文件系统
文件写入
需要引入模块
var fs = require("fs");
同步和异步的调用
- fs模块中所有的操作都有两种形式可供选择
同步
和异步
。- 同步文件系统
会阻塞程序的执行
,也就是 除非操作完毕,否则不会向下执行代码。- 异步文件系统
不会阻塞程序的执行
,而是 在操作完成时,通过回调函数将结果返回。
同步文件的写入
- 打开文件
fs.openSync(path, flags[, mode])
- path 要打开文件的路径
- flags 打开文件要做的操作的类型
- r 只读的
- w 可写
- mode 设置文件的操作权限,一般不传
- 写入文件
fs.writeSync(fd, string[, position[, encoding]])
- fd 文件的描述符,需要传递要写入的文件的描述符
- string 要写入的内容
- position 写入的起始位置
- encoding 写入的编码,默认utf-8
- 关闭文件
fs.closeSync(文件标识符);
// 引入文件系统模块 |
异步文件的写入
- 打开文件
fs.open(path, flags[, mode], callback)
- path 要打开文件的路径
- flags 打开文件要做的操作的类型
- r 只读的
- w 可写
- callback 回调函数
- 异步调用的方法,结果都是通过回调函数的参数返回的
- 回调函数两个参数:
- err 错误对象,如果没有错误则为null
- fd 文件的描述符
- 写入文件
fs.write(fd, string[, position[, encoding]], callback)
- 用来异步写入一个文件
- fd 文件的描述符,需要传递要写入的文件的描述符
- string 要写入的内容
- position 写入的起始位置
- callback 回调函数
- 回调函数三个参数:
- err 错误对象,如果没有错误则为null
- written 写入多少字节
- string 写入的内容
- 关闭文件
fs.close(fd, callback)
- 用来关闭文件
//引入fs模块 |
同步与异步的区别
- 同步文件系统会阻塞程序的执行,也就是 除非操作完毕,否则不会向下执行代码。
- 异步文件系统不会阻塞程序的执行,而是 在操作完成时,通过回调函数将结果返回。
简单文件写入
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
- - file 要操作的文件的路径
- data 要写入的数据
- options 选项,可以对写入进行一些设置
- encoding 设置编码
- mode 文件权限
- flag
- r 只读
- w 可写
- a 追加
- callback 当写入完成以后执行的函数
//引入fs模块 |
流式文件写入
同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
流式文件写入可以解决大文件写入问题
- 创建一个可写流
var ws = fs.createWriteStream(path[, options])
- 可以用来创建一个可写流
- path,文件路径
- options 配置的参数
- 写入内容
.write(string)
通过
ws.write(string)
向文件中输出内容
- 关闭流
end()
通过
ws.end()
关闭流
- 监听流
可以通过监听流的
open
和close
事件来监听流的打开和关闭
- 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"); |
文件的复制
|
感觉上面方法太复杂了,换一个简单一点的方式来搞定
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){ |
剪切/移动
fs.rename("hello.txt","C:/Temp/hello.txt", function(err){ |
监视文件
fs.watchFile(filename[, options], listener)
- 参数
- filename 要监视的文件的名字
- options 配置选项
- listener 回调函数,当文件发生变化时,回调函数执行
- 参数,两个对象都是
stats
对象- curr 当前文件状态
- prev 修改文件的状态
- 参数,两个对象都是
- 参数
fs.watchFile("hello.txt",function(curr, prev){ |