node.js文件操作

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参数说明
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类函数说明
函数 说明
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');
路径字符串操作API
函数 说明
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');
	});
});

猜你喜欢

转载自blog.csdn.net/qq_25000935/article/details/84972719