From e9c96ce5637a04d9fb3fea12e381be64bfb6b141 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Sun, 15 Jan 2023 17:55:14 +0800 Subject: [PATCH] workaround trashItem issue #29598 fixes #1381 --- public/electron.js | 13 +++++++++++-- src/util.js | 10 +++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/public/electron.js b/public/electron.js index bfa55518..43a0d590 100644 --- a/public/electron.js +++ b/public/electron.js @@ -9,6 +9,7 @@ const debounce = require('lodash/debounce'); const yargsParser = require('yargs-parser'); const JSON5 = require('json5'); const remote = require('@electron/remote/main'); +const { stat } = require('fs/promises'); const logger = require('./logger'); const menu = require('./menu'); @@ -18,8 +19,7 @@ const { checkNewVersion } = require('./update-checker'); require('./i18n'); -const { app, ipcMain } = electron; -const { BrowserWindow } = electron; +const { app, ipcMain, shell, BrowserWindow } = electron; remote.initialize(); @@ -243,6 +243,15 @@ if (!argv.allowMultipleInstances && !safeRequestSingleInstanceLock({ argv: proce ipcMain.on('setLanguage', (e, language) => { i18n.changeLanguage(language).then(() => updateMenu()).catch((err) => logger.error('Failed to set language', err)); }); + + ipcMain.handle('tryTrashItem', async (e, path) => { + try { + await stat(path); + } catch (err) { + if (err.code === 'ENOENT') return; + } + await shell.trashItem(path); + }); } function focusWindow() { diff --git a/src/util.js b/src/util.js index 7224b5a2..bfafabe2 100644 --- a/src/util.js +++ b/src/util.js @@ -9,13 +9,13 @@ import isDev from './isDev'; const { dirname, parse: parsePath, join, basename, extname, isAbsolute, resolve } = window.require('path'); const fs = window.require('fs-extra'); const os = window.require('os'); -const { shell } = window.require('electron'); +const { ipcRenderer } = window.require('electron'); const remote = window.require('@electron/remote'); const { readdir, unlink } = fs; -const trash = async (path) => shell.trashItem(path); +const trashFile = async (path) => ipcRenderer.invoke('tryTrashItem', path); export function getFileDir(filePath) { return filePath ? dirname(filePath) : undefined; @@ -264,7 +264,7 @@ export async function deleteFiles({ toDelete, paths: { previewFilePath, sourceFi if (toDelete.tmpFiles && previewFilePath) { try { - await trash(previewFilePath); + await trashFile(previewFilePath); } catch (err) { console.error(err); failedToTrashFiles.push(previewFilePath); @@ -273,7 +273,7 @@ export async function deleteFiles({ toDelete, paths: { previewFilePath, sourceFi if (toDelete.projectFile && projectFilePath) { try { // throw new Error('test'); - await trash(projectFilePath); + await trashFile(projectFilePath); } catch (err) { console.error(err); failedToTrashFiles.push(projectFilePath); @@ -281,7 +281,7 @@ export async function deleteFiles({ toDelete, paths: { previewFilePath, sourceFi } if (toDelete.sourceFile) { try { - await trash(sourceFilePath); + await trashFile(sourceFilePath); } catch (err) { console.error(err); failedToTrashFiles.push(sourceFilePath);