node.js实现
const fs = require('fs')
const FileQueue = require('filequeue') //是同文件队列解决EMFILE: too many open files, open
const fs1 = new FileQueue(100)
const path = require('path')
const crypto = require('crypto')
const date = new Date()
const toLocaleDate = date.toLocaleDateString() //当前日期
const filesMd5Path = `../file/files-md5/${toLocaleDate}.md` //生成的表路径
const filterDir = [
'node_modules',
'.history',
'.idea',
'.git',
'.vscode',
'logs',
] //要过滤掉的文件夹
const paths = path.join(__dirname, '..') //要生成md5的文件路径
let num = 0
getFiles(paths)
async function getFiles(dir) {
const stat = fs.statSync(dir)
if (stat.isDirectory()) {
//判断是不是目录
const pathObj = path.parse(dir)
if (filterDir.includes(pathObj.base)) return false //过滤掉
//if (pathObj.base.indexOf('.') === 0) return false //如果以点开头的就忽略掉
fs1.readdir(dir, function (err, dirs) {
if (err) return false
dirs.forEach((value) => {
getFiles(path.join(dir, value))
})
}) //读取目录
} else if (stat.isFile()) {
//判断是不是文件
const obj = await readBigFile(dir) //大文件
//console.log(obj)
appendFile(obj)
}
}
/**
* 获取大文件md5
* @param {*} dir
*/
function readBigFile(dir) {
return new Promise((resolve) => {
const stream = fs.createReadStream(dir)
const hash = crypto.createHash('md5')
stream.on('data', (chunk) => {
hash.update(chunk, 'utf8')
})
stream.on('end', () => {
const md5Sum = hash.digest('hex')
const obj = { dir, md5Sum }
resolve(obj)
})
})
}
/**
* 追加文件写入
* @param {*} obj
*/
function appendFile(obj) {
let str = ``
let dir = obj.dir
if (path.sep === '\\') {
dir = dir.replace(/\\/g, '\\\\') //解决linux 路径\.在markdown显示.的问题
}
if (num === 0) {
str += `
#### 生成时间:${new Date()}
|ID|路径|md5值|
|:---:|----|----|
`
}
num += 1
str += `|${num}|${dir}|${obj.md5Sum}|\n`
fs.appendFile(filesMd5Path, str, (err) => {
if (err) return err
console.log(`表内容写入文件成功,内容${str}`)
})
}
此外平台生成文件md5值
linux 平台
md5sum 文件名
window 平台
certutil -hashfile 文件绝对路径 md5