Mostra una progress bar con messaggio contestuale nelle 4 fasi: scansione sorgente, analisi cartella destinazione (con contatore cartelle), ricerca duplicati (con contatore file CAD), smistamento (N / totale). La barra è indeterminata nelle prime tre fasi e determinata durante la copia. Il canale IPC progress viene aperto all'inizio e chiuso al termine dell'operazione
52 lines
1.1 KiB
JavaScript
52 lines
1.1 KiB
JavaScript
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
|
|
const CODE_FOLDER_REGEX = /^\d{3}$/;
|
|
const MAX_SCAN_DEPTH = 6;
|
|
|
|
async function buildDestinationIndex(destinationRoot, onProgress) {
|
|
const index = new Map();
|
|
|
|
if (!destinationRoot || !(await fs.pathExists(destinationRoot))) {
|
|
return index;
|
|
}
|
|
|
|
let scanned = 0;
|
|
|
|
async function walk(currentDir, depth) {
|
|
if (depth > MAX_SCAN_DEPTH) {
|
|
return;
|
|
}
|
|
|
|
let entries;
|
|
try {
|
|
entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
} catch {
|
|
return;
|
|
}
|
|
|
|
for (const entry of entries) {
|
|
if (!entry.isDirectory()) {
|
|
continue;
|
|
}
|
|
|
|
const fullPath = path.join(currentDir, entry.name);
|
|
scanned += 1;
|
|
onProgress?.({ phase: 'index-dest', scanned, folder: entry.name });
|
|
|
|
if (CODE_FOLDER_REGEX.test(entry.name)) {
|
|
const rows = index.get(entry.name) || [];
|
|
rows.push(fullPath);
|
|
index.set(entry.name, rows);
|
|
}
|
|
|
|
await walk(fullPath, depth + 1);
|
|
}
|
|
}
|
|
|
|
await walk(destinationRoot, 0);
|
|
return index;
|
|
}
|
|
|
|
module.exports = { buildDestinationIndex };
|