const {join, basename} = require('path');
const {readdirSync, statSync, existsSync, mkdirSync, readFileSync, writeFileSync, createReadStream, createWriteStream} = require('fs');
/**
* [FileSystem] 用于找到文件夹内深层嵌套的所有文件
* @params [src] 目标文件夹
*/
class FileSystem {
constructor(src){
this.fileArr = [];
this.src = src;
this.init(src);
}
init(src){
readdirSync(src).forEach(file=>{
const pathname = join(src, file);
if (statSync(pathname).isFile()){
this.fileArr.push(pathname)
} else {
this.init(pathname);
}
})
}
}
// new FileSystem('./src');
/**
* [CopyFile] 继承于FileSystem构造函数,先找到文件夹内所有文件,再判断大小,大文件以流的方式拷贝到big目录,小文件拷贝到small目录
* @params [src] 目标文件夹
*/
class CopyFile extends FileSystem {
constructor (src) {
super(src);
this.copy()
}
copy(){
this.fileArr.forEach(file=>{
if (statSync(file).size / 1024 / 1024 > 100) { // 大于100MB是大文件
// 大
this.createDir('big');
createReadStream(file).pipe(createWriteStream(join('big', basename(file))))
} else {
// 小
this.createDir('small');
writeFileSync(join('small', basename(file)), readFileSync(file))
}
})
}
createDir(dist) {
if (!existsSync(dist)) {
mkdirSync(dist);
}
}
}
new CopyFile(join(__dirname, 'src'))
/**
* [FileBiggerFile] 继承于FileSystem构造函数,用于找到深层嵌套的文件目录中最大的文件
* @params [src] 目标文件夹
*/
class FileBiggerFile extends FileSystem{
constructor (src) {
super(src);
this.find();
}
find(){
const sizes = this.fileArr.map(val => statSync(val).size);
const bigger = sizes.reduce((cur, next)=>{
if (cur > next) {
return cur;
}
return next;
})
return this.fileArr[sizes.indexOf(bigger)]
}
}
new FileBiggerFile(join(__dirname, 'src'));
fs+es6 class类实现文件的拷贝与找目录中的最大文件
最新推荐文章于 2024-04-19 07:52:30 发布