Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove all Electron bloatware on exit?

How can I remove cookies, local storage and other crap from the "AppData\roaming\MyApp" folder, when the electron application quits?

I tried deleting the whole directory on app quit, but it throws me EBUSY errors. Apparently the files are locked or something, almost like someone doesn't want us to be able to remove the bloat?

const fs = require('fs-extra');

const clearBloat = async () => fs.remove(path.join(app.getPath('appData'), app.name));

app.on('window-all-closed', async () => {
  await clearBloat();
});
like image 414
Alex Avatar asked Oct 16 '22 00:10

Alex


1 Answers

After doing some testing, I've found that you have to delete the files after your electron process has ended (trying to delete the files while in the quit or will-quit app events doesn't delete the files/folders; they get re-created right away. Something in electron (likely, Chromium) wants these files/folders to exist while the app is running, and it's too much work to figure out how to hook into it).

What works for me is spawning a detached cmd off a shell that waits 3 seconds, and then deletes all files/folders in a given application folder. What will be an exercise up to the reader will be to hide the output of the ping command (or hide the window, but there's been mixed success on that front), or choose a different command. I've found timeout works, but sleep and choice (ie. something like this) do not work.

Here's what you will need to add:

const { app } = require("electron");
const { spawn } = require("child_process");
const path = require("path");

...

app.on("will-quit", async (event) => {
  const folder = path.join(app.getPath("appData"), app.name);

  // Wait 3 seconds, navigate into your app folder and delete all files/folders
  const cmd = `ping localhost -n 3 > nul 2>&1 && pushd "${folder}" && (rd /s /q "${folder}" 2>nul & popd)`;
  
  // shell = true prevents EONENT errors
  // stdio = ignore allows the pipes to continue processing w/o handling command output
  // detached = true allows the command to run once your app is [completely] shut down
  const process = spawn(cmd, { shell: true, stdio: "ignore", detached: true });

  // Prevents the parent process from waiting for the child (this) process to finish
  process.unref();
});

As another user mentioned, there's a method available on your electron session that is a native API that clears all of these files/folders. However, it returns a promise, and I could not figure out how to execute this synchronously within one of these app-events.

Reference #1

like image 72
reZach Avatar answered Nov 01 '22 13:11

reZach