Nodejs 遍歷目錄樹 組建內存tree

最近好久都沒寫博客了,主要是沒幹iOS了,現在在寫後端,用的Nodejs,加上最早java的功底,以及對javascript的瞭解,目前沒什麼問題+

說說最近的項目中遇到的一個小需求。

把硬盤所有文件爬一遍並計算hash,不過話說回來。nodejs的Stream是真的好用。

爲什麼有這個需求,不講了。實現原理也就是visitor Pattern.tree model

以下是代碼。

[javascript] view plain copy
  1. const fs = require('fs')  
  2. const path = require('path')  
  3.   
  4. const uuid = require('uuid')  
  5.   
  6. class Node {  
  7.   constructor(name, type, parent){  
  8.     this.name = name  
  9.     this.parent = parent  
  10.     this.child = []  
  11.     this.type = type  
  12.     this.id = uuid.v4()  
  13.   }  
  14. }  
  15.  
[javascript] view plain copy
  1. //這就是一個 visitor  
  2. function visit(dir, dirContext, func, done) {  
  3.   fs.readdir(dir, (err, entries) => {  
  4.     if (err || entries.length === 0) return done()  
  5.     let count = entries.length  
  6.     entries.forEach(entry => {  
  7.       func(dir, dirContext, entry, (entryContext) => {  
  8.         if (entryContext) {  
  9.           visit(path.join(dir, entry), entryContext, func, () => {  
  10.             count--  
  11.             if (count === 0) done()  
  12.           })  
  13.         }  
  14.         else {  
  15.           count --  
  16.           if (count === 0) done()  
  17.         }  
  18.       })  
  19.     })  
  20.   })  
  21. }  
  22.   
  23. let count = 0  
  24. let map = new Map()  
  25. let u = false  
  26. const clean = (dir, dirContext, entry, callback) => {  
  27.   console.log(count++)  
  28.   let fpath = path.join(dir, entry)  
  29.   
  30.   fs.lstat(fpath, (err, stats) => {  
  31.     if(err) return callback()  
  32.     if(stats.isFile()){  
  33.       let node = new Node(entry, 'file')  
  34.       map.set(node.id, node)  
  35.       dirContext.child.push(node)  
  36.       callback()   
  37.     }else if(stats.isDirectory()){  
  38.       let node = new Node(entry, 'folder')  
  39.       map.set(node.id, node)  
  40.       dirContext.child.push(node)  
  41.       callback(node)  
  42.     }else{  
  43.       let node = new Node(entry, 'unknown')  
  44.       u = node.id  
  45.       map.set(node.id, node)  
  46.       dirContext.child.push(node)  
  47.       callback(node)  
  48.     }  
  49.   })  
  50. }  
  51.   
  52. let n = new Node('usr''folder')  
  53. map.set(n.id, n)  
  54.   
  55. visit('/usr', n, clean, ()=> {  
  56.   fs.writeFile('test.json', JSON.stringify(n, null' '))  
  57.   console.log('----------------------------',map.size)  
  58.   console.log(map.get(n.id))  
  59. })
具體實現就是這些了。裏面沒有包括hashworker的代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章