简介
fs
模块是node.js
中的文件操作模块。
- 导入
const fs = require('fs');
- 异步
fs.readFile('file.txt', function(err, data){
if(err){
console.log('something was wrong : ', err.toString());
return;
}
console.log('async read : ', data.toString());
})
readFile
:默认异步方式处理,自定义回调函数
callback
:双入参,第一个err
错误信息,后面的data
是读取的数据。
- 同步
var content = fs.readFileSync('file.txt');
console.log('sync read : ', content);
readFileSync
:常用方式,无异步
开篇简介到此为止,接下来深入详解。
状态
const fs = require('fs');
fs.stat('file.txt', function(err, status){
if(err){
console.log('something was wrong : ', err.toString());
return;
}
console.log(status);
})
运行一下就知道是啥东西了,还有相关的状态判断;
方法 | 描述 |
---|---|
isFile |
是文件否 |
isDirectoty |
是目录否 |
isBlockDevice |
块设备否 |
isCharacterDevice |
字符设备否 |
isSymbolicLink |
软链接否 |
isFIFO |
FIFO 否 |
isSocket |
SOCKET 否 |
const fs = require('fs');
fs.stat('file.txt', function(err, status){
if(err){
console.log('something was wrong : ', err.toString());
}
if(status.isFile()){
console.log('this file is a file, not directory');
}else if(status.isDirectory()){
console.log('this file is a directory');
}else{
console.log('unknow file type');
}
})
写入
const fs = require('fs');
fs.writeFile('file.txt', 'new content', function(err){
console.log('this is callback');
if(err){
console.log(err.toString());
return;
}
console.log('write successful');
})
和简介
的例子相对应,这个更容易理解。
不过其中的file.txt
的位置,也可以是文件描述符,后面会使用。
运行能够发现,文件内容每次都在覆盖,这因为差了一些可选参数,
{encoding, mode, flag}
。
encoding
:指定编码,默认utf-8
mode
:指定模式,默认0666
flag
:指定文件模式,默认w
const fs = require('fs');
fs.writeFile('file.txt', 'append Conent', {'flag':'a'}, function(err){
if(err){
console.log(err);
return;
}
console.log('write success');
});
可选参数可有可无,即使
json
指定了,也不用全部设置。这下去看,应该是
append
的了。
打开
前面都是文本文件,接下来说一下文件描述符。
const fs = require('fs');
fs.open('file.txt', 'r+', function(err, fd){
if(err){
console.log(err);
return;
}
console.log('open success');
})
再详细复述一下文件的模式
模式 | 描述 |
---|---|
r |
只读模式,无则报错 |
r+ |
读写模式,无则报错 |
rs |
只读模式,同步读取 |
rs+ |
读写模式,同步操作 |
w |
只写模式,无则创建 |
wx |
只写模式,存在失败 |
w+ |
读写模式,无则创建 |
wx+ |
读写模式,存在失败 |
a |
追加模式,无则创建 |
ax |
追加模式,存在失败 |
a+ |
读写追加,无则创建 |
ax+ |
读写追加,存在失败 |
fs.open(path, flags[, mode], callback)
整体调用参数中,
mode
是可选参数,同linux
。
function callback(err, fd){
...
}
回调函数两个入参
err
:老相识
fd
:文件描述符,后续加深
再读
const fs = require('fs');
fs.open('file.txt', 'r', function(err, fd){
if(err){
console.log('something was wrong : ', err);
return;
}
fs.readFile(fd, function(err, data){
if(err){
console.log('fd error : ', err);
return;
}
console.log('content : ', data.toString());
})
})
随便可以试,
filename
的地方都可以更换为fd
。但是,再操作的时候,读写属性关键看
fd
的。const fs = require('fs'); fs.open('file.txt', 'w', function(err, fd){ if(err){ console.log('something was wrong : ', err); return; } fs.readFile(fd, function(err, data){ if(err){ console.log('fd error : ', err); return; } console.log('content : ', data.toString()); }) })
如果模式不对,就会报错,这个时候就多关注一下
fd
的模式。
再写
其实没啥变化,就是
filename
替换为了fd
,不必再说。
异步
- 读取
const fs = require('fs'); var buffer = Buffer.alloc(1024); fs.open('file.txt', 'r', function(err, fd){ if(err){ return; } fs.read(fd, buffer, 0, buffer.length, 0, function(err, readLength){ if(err){ return; } console.log('read bytes length : ', readLength); console.log('read file content : ', buffer.slice(0, readLength).toString()); }) });
fs.read(fd, buffer, offset, length, position, callback)
offset
:buffer
的写起始位置
length
:想要读取的长度
position
:文件开始读取位置
callback
:回调函数
callback(err, length, buffer)
err
:老东西
length
:已经读取的长度
buffer
:读取的buffer
- 截取
const fs = require('fs'); var buffer = Buffer.alloc(1024); fs.open('file.txt', 'r+', function(err, fd){ if(err){ return; }; fs.ftruncate(fd, 5, function(err)){ if(err){ return; }; fs.read(fd, buffer, 0, buffer.length, 0, function(err, length, buf){ if(err){ return; } console.log('read content : ', buffer.slice(0, length).toString()); }); } })
截取是真实的文件修改,不是部分读取,文件内容会被截断。
- 关闭
fs.close(fd, function(err){ if(err){ console.log('something was wrong : ', err); return; } console.log('file was closed !'); })
删除
const fs = require('fs');
fs.unlink('file.txt', function(err){
if(err){
console.log('something was wrong : ', err);
return;
}
console.log('file was deleted !');
})
目录
- 创建
const fs = require('fs');
fs.mkdir('./newDir', function(err){
if(err){
return;
}
console.log('mkdir over');
})
- 读取
const fs = require('fs');
fs.readdir('.', function(err, files){
files.forEach(function(file){
console.log(file);
});
});
- 删除
const fs = require('fs');
fs.rmdir('./dir', function(){
console.log('remove over');
});
更多
更多更全请参看官方文档。