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

我们已经知道使用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)=='https://www.jb51.net/' ? path+item : path+'https://www.jb51.net/'+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', './node_modules/formidable/.travis.yml', './node_modules/formidable/index.js', './node_modules/formidable/lib/file.js', './node_modules/formidable/lib/incoming_form.js', './node_modules/formidable/lib/index.js', ... ]

如果想要输出一种树形的结构,就可以对当前的递归程序进行改造,比如我想要输出如下的这种结果,那么,就要分析这种结构的特点:

bing.doc img |---1484234634801.png |---1484234660592.png |---test.png inter.js msg.txt node_modules |---formidable |---.npmignore |---.travis.yml |---index.js |---lib |---file.js |---incoming_form.js |---index.js

可以看出的规律:

第一层级的文件和文件夹前面是没有空格和字符的;

第一级子目录中的文件或文件夹前面是1组空格和1个字符;

第二级子目录中的文件或文件夹前面是2组空格和1个字符;

依次类推…

我们可以再传递一个depth来表示当前目录的层级,然后计算出前面空格的数量:

// depth为递归的深度,可根据递归的深度输出文件名称前面的格式 function readDirAll(path, depth){ // 获取字符串 var getLastCode = function(str){ return str.substr(str.length-1, 1); } depth = depth || 0; // 默认为0 var fir_code = ''; // 计算文件名称前面的字符,4个空格为1组 for(var j=0; j<depth; j++){ fir_code += ' '; } depth && (fir_code += '|---'); var stats = fs.statSync(path); if( stats.isFile() ){ console.log( fir_code+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)=='https://www.jb51.net/' ? path+item : path+'https://www.jb51.net/'+item, st = fs.statSync(itempath); console.log( fir_code+item ); if( st.isDirectory() ){ var s = readDirAll( itempath, depth+1 ); } } } } console.log( readDirAll('./') );

3.2 删除目录

使用fs.rmdir(path)是有局限性的,只能删除空目录,如果是个非空目录,我们可以根据上面的思路,写出一个能删除当前目录下所有的文件。递归,只要找到里面的文件夹就递归寻找,直到找到最底层,把最底层的文件删除,然后再逐级向上删除文件夹,直到删除到当前目录。

// 删除path下所有的文件和文件夹,包括path自己 function rmDirAll(path){ // 获取字符串 var getLastCode = function(str){ return str.substr(str.length-1, 1); } var stats = fs.statSync(path); // 获取当前文件的状态 if( stats.isFile() ){ fs.unlinkSync(path); console.log( '删除成功: '+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)=='https://www.jb51.net/' ? path+item : path+'https://www.jb51.net/'+item; // 拼接路径 var st = fs.statSync(itempath); if( st.isFile() ){ fs.unlinkSync(itempath); console.log( '删除成功: '+itempath ); }else if( st.isDirectory() ){ // 当前是文件夹,则递归检索 rmDirAll( itempath ); } } // 现在可以删除文件夹 fs.rmdir(path); console.log( '删除成功: '+path ); } } rmDirAll('./img');

则删除时输出的信息如下,先把内部的文件和文件夹删除干净,最后删除 ‘./img':

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzsgy.html