目录操作
创建
【fs.mkdir(path[, mode], callback)】参数如下:
path - 文件路径。
mode - 设置目录权限,默认为 0777。
callback - 回调函数,回调只有一个可能的异常参数
var fs = require('fs');
fs.mkdir('./1',function(err){
console.log(err);//null
})
【fs.mkdirSync(path[, mode])】
fs.mkdir(path[, mode], callback)的同步版本,返回undefined
var fs = require('fs');
fs.mkdirSync('./2');
删除
【fs.rmdir(path, callback)】参数如下:
path - 文件路径。
callback - 回调函数,回调只有一个可能的异常参数
var fs = require('fs');
fs.rmdir('./1',function(err){
console.log(err);//null
})
【fs.rmdirSync(path, callback)】
fs.rmdir(path, callback)的同步版本,返回undefined
var fs = require('fs');
fs.rmdirSync('./2');
读取
【fs.readdir(path[, options], callback)】参数如下:
var fs = require('fs');
fs.readdir('./',function(err,data){
console.log(err);//null
/*
[ '.idea',
'1',
'a.txt',
'go.js',
'index.txt',
'main.js',
'node_modules',
'package-lock.json',
'package.json',
'server.js',
'template.pug',
*/
console.log(data);
})
【fs.readdirSync(path[, options], callback)】
fs.readdir(path[, options], callback)的同步版本,返回一个不包括 '.'
和 '..'
的文件名的数组
var fs = require('fs');
var result = fs.readdirSync('./');
/*
[ '.csslintrc',
'.jshintrc',
'a.txt',
'dist',
'Gruntfile.js',
'Gruntfile1.js',
'index.html',
'main.js',
'node_modules',
'package.json',
'src' ]
*/
console.log(result);
遍历目录
遍历目录是操作文件时的一个常见需求。比如写一个程序,需要找到并处理指定目录下的所有JS文件时,就需要遍历整个目录。
遍历目录时一般使用递归算法,否则就难以编写出简洁的代码。递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题。
function factorial(n) {
if (n === 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
上边的函数用于计算N的阶乘(N!)。可以看到,当N大于1时,问题简化为计算N乘以N-1的阶乘。当N等于1时,问题达到最小规模,不需要再简化,因此直接返回1。
目录是一个树状结构,在遍历时一般使用深度优先+先序遍历算法。深度优先,意味着到达一个节点后,首先接着遍历子节点而不是邻居节点。先序遍历,意味着首次到达了某节点就算遍历完成,而不是最后一次返回某节点才算数。因此使用这种遍历方式时,下边这棵树的遍历顺序是A > B > D > E > C > F。
A
/ \
B C
/ \ \
D E F
function travel(dir, callback) {
fs.readdirSync(dir).forEach(function (file) {
var pathname = path.join(dir, file);
if (fs.statSync(pathname).isDirectory()) {
travel(pathname, callback);
} else {
callback(pathname);
}
});
}
可以看到,该函数以某个目录作为遍历的起点。遇到一个子目录时,就先接着遍历子目录。遇到一个文件时,就把文件的绝对路径传给回调函数。回调函数拿到文件路径后,就可以做各种判断和处理。