node.js学习笔记(二)文件系统
本文由 小茗同学 发表于 2016-11-02 浏览(1370)
最后修改 2018-12-25 标签:nodejs fs 文件系统

前言

文件系统对于写一些小脚本、小工具而言非常重要,所以最先介绍文件系统相关方法的使用。

常见API

const fs = require('fs');
const path = 'test.txt';
const content = '这是新写入的文件内容';

// 写入文件,编码默认就是utf8
fs.writeFileSync(path, content, 'utf-8');

// 读取文件,如果指定编码就返回字符串,否则返回buffer
console.log(fs.readFileSync(path, 'utf-8'));

// 判断是文件还是目录
var stat = fs.statSync(path);
console.log('是否是目录:' + stat.isDirectory());
console.log('是否是文件:' + stat.isFile());

// 判断是否存在
fs.existsSync(path);

// 删除文件
fs.unlinkSync(fileName);

// 新建文件夹
fs.mkdirSync(folderName);

// 删除文件夹,注意这个只能删除空文件夹,非空会报错
fs.rmdirSync(folderPath);

// 重命名
fs.renameSync(oldPath, newPath);

// 遍历文件夹,files是新文件名组成的数组,非完整路径,包括 . 和 .. 
var files = fs.readdirSync(path);

新建多层文件夹

默认的fs.mkdirSync(path)无法创建多层文件夹,需要自己实现:

/**
 * 同步创建多层文件夹
 * @param 文件夹路径,必须时“/”分隔,如:res/css/bootstrap
 * @param 模式,可选
 */
function mkdirsSync(dirpath, mode)
{
	if (fs.existsSync(dirpath)) return true;
	var temp = '', sep = '/';
	dirpath.split(sep).forEach(function(dirname)
	{
		temp += (temp ? sep : '') + dirname;
		console.log(temp);
		if (fs.existsSync(temp)) return;
		if (!fs.mkdirSync(temp, mode)) return false;
	});
	return true;
}

递归遍历文件夹

简单写了2个示例方法,一个是异步的,一个是同步的,异步的不太好判断何时遍历结束,可以配合Promise使用,但是个人觉得遍历一个文件夹有啥好异步的,又不涉及网络,所以推荐使用同步方法

异步遍历:

function scanFolder(path, callback, idx)
{
	idx = idx == undefined ? 0 : idx;
	fs.stat(path, function(error, stat)
	{
		if(error) throw new Error(error);
		// 如果是文件,无需遍历
		if(!stat.isDirectory()) callback(path, idx);
		else
		{
			fs.readdir(path, function(err, files)
			{
				if(err) throw new Error(err);
				else
				{
					files.forEach(function(file)
					{
						scanFolder(path + '/' + file, callback, idx+1);
					});
				}
			});
		}
	});
}

同步遍历:

/**
 * 遍历某个文件夹
 */
function scanFolderSync(folderPath, callback) {
	let idx = arguments[2] == undefined ? 1 : idx;
	if(!fs.statSync(folderPath).isDirectory()) callback(folderPath, idx);
	else {
		fs.readdirSync(folderPath).forEach(function(file) {
			var tempPath = folderPath + '/' + file;  
			if(fs.statSync(tempPath).isDirectory()) scanFolderSync(tempPath, callback, idx+1);
			else callback(tempPath, idx);
		});
	}
},

第三方库

原生fs功能有限,可以考虑第三方库:https://github.com/jprichardson/node-fs-extra

npm install --save fs-extra

使用(可以用fs-extra完全替代fs):

const fs = require('fs-extra');