1 文件基本操作
Node.js的文件操作API由fs(file system)模块提供,该模块提供的函数均有异步和同步版本,比如读取文件有异步的fs.readFile()和同步的fs.readFileSync().
与同步相比,异步函数性能更高,速度更快,而且没有阻塞,所以更推荐使用异步函数.
1.1 文件写入
fs模块是Node.js的核心模块,使用某个模块的API之前,需要首先加载这个模块
var fs = require('fs');
Node.js的文件写入语法
// 同步写入
fs.whiteFileSync(file, data [,options]);
// 异步写入
fs.whiteFile(file, data [,options], callback);
/*
如果文件存在,此语法会覆盖旧的文件内容
与同步函数相比,异步函数的参数中多了一个回调函数 callback
*/
参数 | 说明 |
---|---|
file | 文件名或文件描述符 |
data | 要写入文件的数据,可以是string或buffer对象 |
options | 该参数是一个对象,包含{e,encoding, mode, flag}.默认编码为utf-8,模式为0o666, flag为’w’ |
callback | 回调函数,回调函数只包含错误信息(err),在写入失败时返回 |
如果指定读取的文件不存在,则抛出异常
flag | 描述 |
---|---|
r | 文件名或文件描述符 |
r+ | 打开文件进行读取和写入,如果该文件不存在则发生异常 |
rs | 打开文件,用于在同步方式读取 |
rs+ | 打开文件进行读取和写入,告诉OS同步地打开它 |
w | 打开文件进行写入.该文件被创建(如果它不存在)或截断(如果它存在) |
wx | 类似’w’,如果路径存在则失败 |
w+ | 打开文件进行读取和写入.该文件被创建(如果它不存在)或截断(如果它存在) |
wx+ | 类似’w+’,如果路径存在则失败 |
a | 打开文件进行追加.如果它不存在,则创建该文件 |
ax | 类似’a’,如果路径存在则失败 |
a+ | 打开文件进行读取和附加,如果它不存在,则创建该文件 |
ax+ | 类似’a+’,如果路径存在则失败 |
1.1.1 同步文件写入
/*
* 同步方式写入文件
*/
var fs = require('fs');
// 在进行文件操作的时候,如果是同步API,必须使用try...catch来捕获异常
// 防止程序因为异常而退出,导致后续代码无法继续执行
try {
console.log('write file...');
fs.writeFileSync('E:/test.txt', 'content');
} catch (e) {
console.log('error');
}
1.1.2 异步文件写入
/*
* 异步方式写入文件
*/
var fs = require('fs');
// 回调函数的第一个参数为错误对象
fs.writeFile('E:/test2.txt', 'content2', function(err) {
// 判断是否出现错误,打印错误提示
if (err){
console.log('error');
}
})
后续不再介绍同步文件操作方式
1.2 向文件追加内容
appendFile(file, data [, options], callback);
参数 | 说明 |
---|---|
file | 文件名或文件描述符 |
data | 要写入文件的数据,可以是string或buffer对象 |
options | 该参数是一个对象,包含{e,encoding, mode, flag}.默认编码为utf-8,模式为0o666, flag为’a’ |
callback | 回调函数,回调函数只包含错误信息(err),在追加内容失败时返回 |
/*
* 向文件追加内容
*/
var fs = require('fs'),
data = 's';
fs.appendFile('E:/append.txt', data, function(err) {
if(err) {
// 如果出错,回调函数中的代码不要继续执行
// 可以使用return的方式组织继续执行
return console.log('fail');
}
console.log('success');
})
1.3 文件读取
fs.readFile(file [, options], callback);
参数 | 说明 |
---|---|
file | 文件名或文件描述符 |
options | 该参数是一个对象,包含{e,encoding, mode, flag}.默认编码为null, flag为’r’ |
callback | 回调函数,回调函数只包含错误信息(err),在读取失败时返回 |
/*
* 文件读取
*/
var fs = require('fs');
fs.readFile('E:/read.txt', function(err, data){
if(err) {
retrun console.log('fail');
}
// 这里读取到的内容都是计算机存储的二进制数据
// 需要用 toString() 来转换成方便使用的数据
console.log(data.toString());
});
1.4 文件复制
Node.js中没有直接提供文件复制的函数
1.4.1 文件复制思路
/*
* 文件复制
*/
var fs = require('fs');
// 读取1.txt文件数据
fs.readFile('E:/1.txt', function(err, data){
if(err) {
return console.log('fail');
}
// 将数据写入2.txt
fs.writeFile('E:/2.txt', data.toString(), function(err){
if(err) {
return console.log('fail_2');
}
console.log('success');
});
})
toString()函数可以省略,因为writeFile()在写入数据时还是会将字符串转换为二进制数据
1.4.2 模块化封装文件复制功能
/*
* 文件复制模块
*/
var fs = require('fs');
/*
* 定义文件复制函数
* src: 需要读取的文件
* dist: 目标文件
* callback: 回调函数
*/
function copy() {
// 读取文件
fs.readFile(src, function(err, data){
if(err) {
return callback(err);
}
// 写入文件
fs.writeFile(dist, data.toString(), function(err){
if(err) {
return callback(err);
}
callback(null);
});
})
}
module.exports = copy;
/*
* 测试文件复制
*/
// 加载封装好的文件复制功能模块
var copy = require('./copy_test');
// 调用
copy('E:/b.txt', 'E:/a.txt', function(err) {
if(err) {
return console.log('fail');
}
console.log('success');
})
1.5 获取文件信息
fs.stat(path, callback);
callback带有两个参数(err, stats),stats是fs.stats对象
函数 | 说明 |
---|---|
stats.isFile() | 如果是文件返回true, 否则返回false |
stats.isDirectory() | 如果是目录返回true, 否则返回false |
stats.isBlockDevice() | 如果是块设备返回true, 否则返回false |
stats.isCharacterDevice() | 如果是字符设备返回true, 否则返回false |
stats.isSymobolicLink() | 如果是软连接返回true, 否则返回false |
stats.isFIFO() | 如果是 FIFO 返回true, 否则返回false |
stats.isSocket() | 如果是Socket返回true, 否则返回false |
2 文件相关操作
2.1 路径字符串操作(path 模块)
var path = require('path');
函数 | 说明 |
---|---|
basename(p[,ext]) | 获取文件名 |
dirname(p) | 获取文件目录 |
extname(p) | 获取文件扩展名 |
isAbsolute(path) | 判断是否是绝对路径 |
join([path1][,path2][,…]) | 拼接路径字符串 |
normalize(p) | 将非标准路径转换为标准路径 |
sep | 获取操作系统的文件路径分隔符 |
2.2 目录操作
2.2.1 创建目录
fs.mkdir(path[,options],callback);
参数 | 说明 |
---|---|
path | 文件路径 |
options | recursive,递归,默认false;mode,目录权限,默认0o777,windows不支持mode参数 |
callback | 回调函数,参数为错误信息 |
/*
* 创建目录
*/
var fs = require('fs');
fs.mkdir('E:/source/src/', function(err){
if(err) {
return console.log('fail');
}
console.log('success');
});
2.2.2 读取目录
fs.readdir(path[, options],callback);
参数 | 说明 |
---|---|
path | 目录路径 |
options | encoding,默认utf-8,如果encoding设置为’buffer’,则返回的文件名将作为Buffer对象传递,withFileTypes,默认false,如果options.withFileTypes设置为true,则files数组将包含 fs.Dirent对象 |
callback | 回调函数,参数为错误信息和路径中所有文件的文件名 |
/*
* 读取目录
*/
var fs = require('fs');
fs.readdir('/source/src/', function(err, files){
if (err) throw err; // 同if判断
files.forEach(function(file){
// 输出文件名
console.log(file);
});
});
2.2.3 删除目录和删除文件
/*
* 删除目录
* 删除目录时该目录必须为空,所有删除目录的操作还需要读取目录和删除文件操作进行支持
*/
fs.rmdir(path, callback);
/*
* 删除文件
*/
fs.unlink(path, callback);
/*
* 删除目录
*/
var fs = require('fs');
fs.readdir('/source/src/', function(err, files) {
if (err) throw err;
files.forEach(function(file) {
fs.unlink('/source/src/' + file, function(err) {
if (err) throw err;
});
});
fs.rmdir('/source/src/', function(err) {
if (err) throw err;
console.log('success');
});
});