该文章以收录 《nodeJS探索之路》
本文所有练习已放入:https://github.com/webxiaoma/nodeJS-demos 的 file 文件夹中
前言
fs模块在nodeJS算是比较重要的模块了,本文主要讲的是nodejs 中fs模块的基础知识,目的是了解fs模块的大体作用。使用前先要引入fs模块,本文约定以const fs=require('fs')
引入。详细的API请访问官网fs模块
同步和异步
fs模块中的方法一般的都有同步和异步的方法,例如读取文件
异步方法:
fs.readFile('./test.txt',(err,data)=>{
if(err) throw err;
console.log(data)
})
同步方法
let SyncFile = fs.readFileSync( './test.txt','utf-8');
cosnole.log(SyncFile);
一般同步方法是在异步方法名后面加上了Sync
一词。
文件处理
1.读取文件内容
fs.readFile(path[, options], callback)
参数:
path
<string> | <Buffer> | <URL> | <integer>
文件名或文件描述符。options
<Object> | <string>
encoding
<string> | <null>
默认为 null。flag
<string>
默认为 ‘r’。
callback
<Function>
err
<Error>
data
<string> | <Buffer>
fs.readFile('./test.txt',function(err,data){
if(err){
throw err;
}
console.log(data)
console.log(data.toString())
})
2.写入文件内容
fs.writeFile(file, data[, options], callback)
异步地写入数据到文件,如果文件已经存在,则替代文件。
file
<string> | <Buffer> | <integer>
文件名或文件描述符data
<string> | <Buffer> | <Uint8Array>
options
<Object> | <string>
encoding
<string> | <null>
默认 = ‘utf8’mode
<integer>
默认 = 0o666flag
<string>
默认 = ‘w’
callback
<Function>
fs.writeFile('./write.txt','test',err =>{
if(err) throw err;
console.log("写入成功");
fs.readFile('./write.txt','utf-8',(err,data) =>{
if(err) throw err;
console.log('读取成功:'+ data);
})
})
3.删除文件内容
fs.unlink(path, callback)
path
<string> | <Buffer> | <URL>
callback
<Function>
err
<Error>
fs.unlink('./delete.txt',err=>{
assert.ifError(err);
console.log('以删除文件:delete.txt')
})
4.追加文件内容
fs.appendFile(file, data[, options], callback)
如果追加内容的文件不存在则,创建该文件
file
<string> | <Buffer> | <number>
文件名或文件描述符data
<string> | <Buffer>
options
<Object> | <string>
encoding
<string> | <null>
默认为 ‘utf8’mode
<integer>
默认为 0o666flag
<string>
默认为 ‘a’
callback
<Function>
err
<Error>
fs.appendFile('./add.txt','追加的内容','utf8',(err)=>{
assert.ifError(err);
console.log(fs.readFileSync('./add.txt','utf8'))
})
5.截取文件内容
在说截取文件内容之前,我们还要说一种打开文件,读取写入文件内容的方法
打开文件: fs.open
读取文件内容: fs.read
写入文件内容:fs.write
关闭文件:fs.close
他们和readFile
、writeFile
的区别就是比较底层,fs.read
和fs.write
需要依托fs.open
, 打开文件得到文件句柄,然后基于文件句柄读写。实际上我们用的readFile
、writeFile
还是比较多。我们来看一个例子:
fs.open('./open.txt','a+',(err,fd)=>{
if(err) throw err;
console.log("文件以打开");
let readBuffer = new Buffer.alloc(30);
let writeBuffer = new Buffer.from(" add content")
fs.write(fd,writeBuffer,0,writeBuffer.length,0,(err,bytesWritten,buffer)=>{
if(err) throw err;
console.log(`写入成功,写入的长度:${bytesWritten}, 写入的内容:${buffer}`);
//写入成功,写入的长度: 12, 写入的内容:add content
fs.read(fd,readBuffer,0,30,0,(err, bytesRead, buffer)=>{
if(err) throw err;
console.log(bytesRead) // 17
console.log(buffer.toString());// last add content
// 关闭
fs.close(fd);
})
})
})
我们这里说的截取文件内容的方法是基于fs.open
方法的
fs.ftruncate(fd[, len], callback)
fd
<integer>
len
<integer>
默认 = 0callback
<Function>
err
<Error>
let fd = fs.openSync('open.txt','r+');
fs.ftruncate(fd,5,(err)=>{
assert.ifError(err);
console.log("截取内容为:" +fs.readFileSync('open.txt','utf-8'));
//截取内容为:last
fs.close(fd);
});
目录操作
1.创建目录
如果文件已经存在,会报错
fs.mkdir('./newdir',function(err){
if(err) throw err
console.log("make dir success")
})
2.读取目录
fs.readdir('./newdir',(err,files)=>{
if(err) throw err;
// files 是一个数组
console.log(Array.isArray(files))
console.log("读目录取成功:"+ files);
})
3.删除目录
删除目录时,如果目录不是空的将会报错
fs.rmdir('./delete_dir',function(err){
if(err) throw err;
console.log('delete dir success')
})
读取文件的常用模式
mode 用于创建文件时给文件制定权限,默认0666
flag:
'r' - 以读取模式打开文件。
'r+' - 以读写模式打开文件。
'rs' - 使用同步模式打开并读取文件。指示操作系统忽略本地文件系统缓存。
'rs+' - 以同步的方式打开,读取 并 写入文件。
//注意:这不是让fs.open变成同步模式的阻塞操作。如果想要同步模式请使用fs.openSync()。
'w' - 以读取模式打开文件,如果文件不存在则创建
'wx' - 和 ' w ' 模式一样,如果文件存在则返回失败
'w+' - 以读写模式打开文件,如果文件不存在则创建
'wx+' - 和 ' w+ ' 模式一样,如果文件存在则返回失败
'a' - 以追加模式打开文件,如果文件不存在则创建
'ax' - 和 ' a ' 模式一样,如果文件存在则返回失败
'a+' - 以读取追加模式打开文件,如果文件不存在则创建
'ax+' - 和 ' a+ ' 模式一样,如果文件存在则返回失败
结束
详细API 请访问node官网