Fix open file issue locking zips.

Add a delete file method.
This commit is contained in:
jliddev
2020-10-19 12:36:17 -05:00
parent f221750037
commit 999505f5a3
5 changed files with 91 additions and 10 deletions

View File

@@ -22,6 +22,7 @@ import {
RENAME_DIRECTORY_CHANNEL,
READ_FILE_CHANNEL,
GET_ASSET_FILE_PATH,
DELETE_FILE_CHANNEL,
} from "./src/common/constants";
import { CurseGetScanResultsRequest } from "./src/common/curse/curse-get-scan-results-request";
import { CurseGetScanResultsResponse } from "./src/common/curse/curse-get-scan-results-response";
@@ -132,13 +133,10 @@ ipcMain.on(LIST_DIRECTORIES_CHANNEL, (evt, arg: ValueRequest<string>) => {
ipcMain.on(PATH_EXISTS_CHANNEL, (evt, arg: ValueRequest<string>) => {
const response: ValueResponse<boolean> = { value: false };
fs.open(arg.value, "r", (err, fid) => {
fs.access(arg.value, (err) => {
if (err) {
if (err.code === "ENOENT") {
response.value = false;
} else {
response.error = err;
}
console.error(err);
response.value = true;
} else {
response.value = true;
}
@@ -243,6 +241,22 @@ ipcMain.on(DELETE_DIRECTORY_CHANNEL, (evt, arg: DeleteDirectoryRequest) => {
});
});
ipcMain.on(DELETE_FILE_CHANNEL, (evt, arg: ValueRequest<string>) => {
console.log("Delete File", arg);
const response: ValueResponse<boolean> = {
value: false,
};
fs.unlink(arg.value, (err) => {
if (err) {
response.error = err;
} else {
response.value = true;
}
evt.reply(arg.responseKey, response);
});
});
ipcMain.on(RENAME_DIRECTORY_CHANNEL, (evt, arg: CopyDirectoryRequest) => {
console.log("Rename Dir", arg);
fs.rename(arg.sourcePath, arg.destinationPath, (err) => {

View File

@@ -224,12 +224,20 @@ export class AddonService {
// TODO track error
} finally {
if (fs.existsSync(unzippedDirectory)) {
const unzippedDirectoryExists = await this._fileService.pathExists(
unzippedDirectory
);
const downloadedFilePathExists = await this._fileService.pathExists(
downloadedFilePath
);
if (unzippedDirectoryExists) {
await this._fileService.deleteDirectory(unzippedDirectory);
}
if (fs.existsSync(downloadedFilePath)) {
fs.unlinkSync(downloadedFilePath);
if (downloadedFilePathExists) {
await this._fileService.deleteFile(downloadedFilePath);
}
}

View File

@@ -2,6 +2,7 @@ import { Injectable } from "@angular/core";
import {
COPY_DIRECTORY_CHANNEL,
DELETE_DIRECTORY_CHANNEL,
DELETE_FILE_CHANNEL,
GET_ASSET_FILE_PATH,
LIST_DIRECTORIES_CHANNEL,
LIST_FILES_CHANNEL,
@@ -53,7 +54,11 @@ export class FileService {
});
}
public pathExists(sourcePath: string) {
public pathExists(sourcePath: string): Promise<boolean> {
if (!sourcePath) {
return Promise.resolve(false);
}
return new Promise((resolve, reject) => {
const eventHandler = (_evt: any, arg: ValueResponse<boolean>) => {
if (arg.error) {
@@ -91,6 +96,25 @@ export class FileService {
});
}
public deleteFile(sourcePath: string): Promise<boolean> {
return new Promise((resolve, reject) => {
const eventHandler = (_evt: any, arg: ValueResponse<boolean>) => {
if (arg.error) {
return reject(arg.error);
}
resolve(arg.value);
};
const request: ValueRequest<string> = {
value: sourcePath,
responseKey: uuidv4(),
};
this._electronService.ipcRenderer.once(request.responseKey, eventHandler);
this._electronService.ipcRenderer.send(DELETE_FILE_CHANNEL, request);
});
}
public copyDirectory(sourcePath: string, destinationPath: string) {
return new Promise((resolve, reject) => {
const eventHandler = (_evt: any, arg: Error) => {
@@ -173,6 +197,14 @@ export class FileService {
});
}
public listEntries(sourcePath: string, filter: string) {
const globFilter = globrex(filter);
return fs
.readdirSync(sourcePath, { withFileTypes: true })
.filter((entry) => !!globFilter.regex.test(entry.name));
}
public listFiles(sourcePath: string, filter: string) {
const globFilter = globrex(filter);

View File

@@ -68,6 +68,8 @@ export class WowUpService {
this.applicationVersion = _electronService.remote.app.getVersion();
this.isBetaBuild =
this.applicationVersion.toLowerCase().indexOf("beta") != -1;
this.cleanupDownloads();
}
public get updaterExists() {
@@ -308,4 +310,28 @@ export class WowUpService {
? WowUpReleaseChannelType.Beta
: WowUpReleaseChannelType.Stable;
}
/**
* Clean up lost downloads in the download folder
*/
private async cleanupDownloads() {
const downloadFiles = this._fileService.listEntries(
this.applicationDownloadsFolderPath,
"*"
);
for (let entry of downloadFiles) {
const path = join(this.applicationDownloadsFolderPath, entry.name);
try {
if (entry.isDirectory()) {
await this._fileService.deleteDirectory(path);
} else {
await this._fileService.deleteFile(path);
}
} catch (e) {
console.error("Failed to delete download entry", path);
console.error(e);
}
}
}
}

View File

@@ -1,6 +1,7 @@
export const DOWNLOAD_FILE_CHANNEL = "download-file";
export const COPY_DIRECTORY_CHANNEL = "copy-directory";
export const DELETE_DIRECTORY_CHANNEL = "delete-directory";
export const DELETE_FILE_CHANNEL = "delete-file";
export const RENAME_DIRECTORY_CHANNEL = "rename-directory";
export const STAT_DIRECTORY_CHANNEL = "stat-directory";
export const LIST_DIRECTORIES_CHANNEL = "list-directories";