从零学习node.js之文件操作(三)

2020-06-17 06:49:51易采站长站整理

ctime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间),
birthtime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间)
}
isfile: true // 是否为文件
isdir: false // 是否为文件夹

关于这几个时间属性的理解,可以参考这篇文章。

stats中的size属性就是当前文件的大小(单位:字节,除以1024即为kb),stats还有下面方法可供使用:

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

fs.stat(path, callback)
是异步执行的,对应的还有同步执行版本:
fs.statSync(path)
,这个方法返回的就是
fs.stats
实例。

三、综合运用

我们在上面的讲解中,还留着两个功能没实现,这里实现一下它的过程。

3.1 遍历目录中所有的文件

我们已经知道使用readdir只能获取当前目录里的文件和文件夹名称,为了获取这个目录里所有的文件名称,只能是读取当前目录里所有的文件夹里的文件。这里我们使用递归的方法,如果当前资源是文件,则进行存储,是文件夹则进行递归进一步检索,直到把所有的文件夹遍历完毕。


// 获取文件夹中所有的文件
function readDirAll(path){
// 获取字符串的最后一个字符
var getLastCode = function(str){
return str.substr(str.length-1, 1);
}

var result = []; // 存储获取到的文件
var stats = fs.statSync(path); // 获取当前文件的状态
if( stats.isFile() ){
result.push(path);
}else if( stats.isDirectory() ){
// 若当前路径是文件夹,则获取路径下所有的信息,并循环
var files = fs.readdirSync(path);

for(var i=0, len=files.length; i<len; i++){
var item = files[i],
itempath = getLastCode(path)=='/' ? path+item : path+'/'+item; // 拼接路径
var st = fs.statSync(itempath);
if( st.isFile() ){
result.push(itempath);
}else if( st.isDirectory() ){
// 当前是文件夹,则递归检索,将递归获取到的文件列表与当前result进行拼接
var s = readDirAll( itempath );
result = result.concat( s );
}
}
}
return result;
}
console.log( readDirAll('./') );

使用此程序获取当前目录中所有的文件(展示的为部分文件):


[
'./bing.doc',
'./img/1484234634801.png',
'./img/1484234660592.png',
'./img/test.png',
'./inter.js',
'./msg.txt',
'./node_modules/formidable/.npmignore',