nv-file-grpby-size 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +100 -0
  2. package/package.json +11 -0
package/index.js ADDED
@@ -0,0 +1,100 @@
1
+ const _fs=require("fs");
2
+
3
+ function calculateSizeGroup(size) {
4
+ if (size === 0) return 0; // 0字节文件
5
+ if (size === 1) return 1; // 1字节文件
6
+ if (size === 2) return 2; // 2字节文件
7
+ // 计算指数分组:3-4字节→组3, 5-8字节→组4, 9-16字节→组5...
8
+ let power = 2; // 起始指数
9
+ var v = Math.pow(2, power);
10
+ while (v < size) {
11
+ power++;
12
+ v = Math.pow(2, power);
13
+ }
14
+ return v; // 组ID = 指数值
15
+ }
16
+
17
+ const makeGroups =()=>{
18
+ var d = {
19
+ 0:[],
20
+ 1:[],
21
+ 2:[],
22
+ }
23
+ for(let pow=2;pow<53;++pow) {
24
+ d[2**pow] = []
25
+ }
26
+ return d;
27
+ }
28
+
29
+ const sync = (file_paths) =>{
30
+ //使用 _fs.lstatsSync
31
+ // 使用前要判断文件是否存在 且类型必须是File
32
+ //按照 <=0 <=1 <=2 <=4 <=8 ..... 分类
33
+ var grps = {};
34
+ for(var fn of file_paths) {
35
+ if (_fs.existsSync(fn)) {
36
+ var stats = _fs.lstatSync(fn);
37
+ if (stats.isFile()) {
38
+ var id = calculateSizeGroup(stats.size);
39
+ if(grps[id]) {grps[id].push(fn)} else {grps[id]=[fn]}
40
+ } else {
41
+
42
+ }
43
+ } else {
44
+ }
45
+ }
46
+ return grps;
47
+ }
48
+
49
+
50
+ const async_grp_all_file_paths_by_size = async (file_paths,concurrent_count=1000) =>{
51
+ var grps = {};
52
+ var cnt = file_paths.length;
53
+ var r = cnt % concurrent_count;
54
+ var cnt0 = cnt-r;
55
+ for(var i=0;i<cnt0; i+=concurrent_count) {
56
+ var ps = [];
57
+ for(var j=0;j<concurrent_count;++j) {
58
+ ps.push((async (fn)=>{
59
+ if(_fs.existsSync(fn)) {
60
+ try {
61
+ const stats = await fs.promises.lstat(fn);
62
+ if (stats.isFile()) {
63
+ var id = calculateSizeGroup(stats.size);
64
+ if(grps[id]) {grps[id].push(fn)} else {grps[id]=[fn]}
65
+ }
66
+ }catch(e) {
67
+ console.log(e)
68
+ }
69
+ }
70
+ })(file_paths[i+j]))
71
+ }
72
+ await Promise.all(ps);
73
+ }
74
+ {
75
+ var ps = [];
76
+ for(var j=0;j<r;++j) {
77
+ ps.push((async (fn)=>{
78
+ if(_fs.existsSync(fn)) {
79
+ try {
80
+ const stats = await fs.promises.lstat(fn);
81
+ if (stats.isFile()) {
82
+ var id = calculateSizeGroup(stats.size);
83
+ if(grps[id]) {grps[id].push(fn)} else {grps[id]=[fn]}
84
+ }
85
+ }catch(e) {
86
+ console.log(e)
87
+ }
88
+ }
89
+ })(file_paths[j]))
90
+ }
91
+ await Promise.all(ps);
92
+ }
93
+ return grps;
94
+ }
95
+
96
+
97
+ module.exports = async_grp_all_file_paths_by_size;
98
+ module.exports.sync = sync;
99
+
100
+
package/package.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "nv-file-grpby-size",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "author": "",
9
+ "license": "ISC",
10
+ "description": ""
11
+ }