Comprimere cartelle in Electron con archiver
In un programmino Electron devo comprimere directory che possono avere anche parecchi files.
Visto che Electron ha Node.js alle spalle, possiamo usare delle sue librerie.
Nello specifico ho scelto archiver, che usa lo streaming per la compressione ed è quindi molto efficiente.
Per installarlo possiamo usare npm:
npm i archiver
Nel main.js:
const bckPath = path.join(exeFolder, 'BCK');
ipcMain.handle('comprimi-cartella', async (event, cartellaOrigine, nomeFileZip) => {
try {
if (!fs.existsSync(bckPath)) {
fs.mkdirSync(bckPath, {recursive: true});
}
const percorsoZip = path.join(bckPath, nomeFileZip);
const output = fs.createWriteStream(percorsoZip);
const archive = archiver('zip', {
zlib: {level: 9}
});
return new Promise((resolve, reject) => {
output.on('close', () => {
resolve({
success: true,
percorso: percorsoZip
});
});
archive.on('error', (err) => {
reject({success: false, errore: err.message});
});
output.on('error', (err) => {
reject({success: false, errore: err.message});
});
archive.pipe(output);
archive.directory(cartellaOrigine, false);
archive.finalize();
});
} catch (error) {
return {success: false, errore: error.message};
}
});
Considerate che sto usando queste opzioni per avviare il programma:
const win = new BrowserWindow({
width: Math.floor(width * 0.8),
height: Math.floor(height * 0.8),
webPreferences: {
preload: path.join(__dirname, "preload.js"),
contextIsolation: true,
nodeIntegration: false
}
});
Poi nel preload.js:
contextBridge.exposeInMainWorld('electronAPI', {
comprimiCartella: (cartellaOrigine, nomeFileZip) => ipcRenderer.invoke('comprimi-cartella', cartellaOrigine, nomeFileZip),
// ALTRO
});
Per usarlo:
const risultato = await window.electronAPI.comprimiCartella('DIR', 'NOME FILE');
if (risultato.success) {
console.log('ZIP creato:', risultato.percorso);
} else {
console.error('Errore compressione:', risultato.errore);
}
Enjoy!
javascript npm electron archiver
Commentami!