From 503450550ad5998483cb7138dea2b8f40b07e896 Mon Sep 17 00:00:00 2001 From: shuzhouhao Date: Fri, 8 Jul 2022 16:08:33 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E8=B7=A8=E8=AE=BE=E5=A4=87=E7=A7=BB=E5=88=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: shuzhouhao --- .../FileExtensionAbility.ts | 74 +++++++++++++------ 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index 756e587c..29b95352 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -41,10 +41,10 @@ export default class FileExtAbility extends Extension { } checkUri(uri) { - if(uri.indexOf(FILE_ACCESS) == 0) { + if (uri.indexOf(FILE_ACCESS) == 0) { uri = uri.replace(FILE_ACCESS, ''); return /^\/([^\/]+\/?)+$/.test(uri); - } else{ + } else { return false; } } @@ -59,13 +59,15 @@ export default class FileExtAbility extends Extension { if (arr[1].indexOf('/') > 0) { path = path.replace(arr[1].split('/')[0], ''); } + if (path.charAt(path.length - 1) == '/') { + path = path.substr(0, path.length - 1); + } return path; } genNewFileUri(uri, displayName) { - let arr = uri.split('/'); let newFileUri = uri; - if (arr.pop() == '') { + if (uri.charAt(uri.length - 1) == '/') { newFileUri += displayName; } else { newFileUri += '/' + displayName; @@ -110,13 +112,14 @@ export default class FileExtAbility extends Extension { if (stat.isDirectory()) { let dir = fileio.opendirSync(path); let hasNextFile = true; + cb(path, true, hasNextFile); while (hasNextFile) { try { let dirent = dir.readSync(); this.listDir(path + '/' + dirent.name, cb); } catch (e) { hasNextFile = false; - cb(path, true); + cb(path, true, hasNextFile); } } } else { @@ -129,7 +132,7 @@ export default class FileExtAbility extends Extension { } openFile(sourceFileUri, flags) { - if(!this.checkUri(sourceFileUri)) { + if (!this.checkUri(sourceFileUri)) { return -1; } let fd = 0; @@ -154,7 +157,7 @@ export default class FileExtAbility extends Extension { } createFile(parentUri, displayName) { - if(!this.checkUri(parentUri)) { + if (!this.checkUri(parentUri)) { return ''; } try { @@ -169,7 +172,7 @@ export default class FileExtAbility extends Extension { } mkdir(parentUri, displayName) { - if(!this.checkUri(parentUri)) { + if (!this.checkUri(parentUri)) { return ''; } try { @@ -184,15 +187,17 @@ export default class FileExtAbility extends Extension { } delete(selectFileUri) { - if(!this.checkUri(selectFileUri)) { + if (!this.checkUri(selectFileUri)) { return -1; } let path = this.getPath(selectFileUri); let code = 0; - this.listDir(path, function (filePath, isDirectory) { + this.listDir(path, function (filePath, isDirectory, hasNextFile) { try { if (isDirectory) { - fileio.rmdirSync(filePath); + if (!hasNextFile) { + fileio.rmdirSync(filePath); + } } else { fileio.unlinkSync(filePath); } @@ -205,24 +210,46 @@ export default class FileExtAbility extends Extension { } move(sourceFileUri, targetParentUri) { - if(!this.checkUri(sourceFileUri) || !this.checkUri(targetParentUri)) { + if (!this.checkUri(sourceFileUri) || !this.checkUri(targetParentUri)) { return ''; } - try { - let displayName = this.getFileName(sourceFileUri); - let newFileUri = this.genNewFileUri(targetParentUri, displayName); - let oldPath = this.getPath(sourceFileUri); - let newPath = this.getPath(newFileUri); - fileio.renameSync(oldPath, newPath); + let displayName = this.getFileName(sourceFileUri); + let newFileUri = this.genNewFileUri(targetParentUri, displayName); + let oldPath = this.getPath(sourceFileUri); + let newPath = this.getPath(newFileUri); + if (oldPath == newPath) { return newFileUri; - } catch (e) { - hilog.error(DOMAIN_CODE, TAG, 'move error ' + e.message); + } else if (newPath.indexOf(oldPath) == 0) { return ''; } + let hasError = false; + this.listDir(oldPath, function (filePath, isDirectory, hasNextFile) { + try { + let newFilePath = filePath.replace(oldPath, newPath); + if (isDirectory) { + if (hasNextFile) { + fileio.mkdirSync(newFilePath); + } else { + fileio.rmdirSync(filePath); + } + } else { + fileio.copyFileSync(filePath, newFilePath); + fileio.unlinkSync(filePath); + } + } catch (e) { + hasError = true; + hilog.error(DOMAIN_CODE, TAG, 'move error ' + e.message); + } + }); + if (hasError) { + return ''; + } else { + return newFileUri; + } } rename(sourceFileUri, displayName) { - if(!this.checkUri(sourceFileUri)) { + if (!this.checkUri(sourceFileUri)) { return ''; } try { @@ -238,7 +265,7 @@ export default class FileExtAbility extends Extension { } query(sourceFileUri) { - if(!this.checkUri(sourceFileUri)) { + if (!this.checkUri(sourceFileUri)) { return null; } try { @@ -259,7 +286,7 @@ export default class FileExtAbility extends Extension { } listFile(sourceFileUri) { - if(!this.checkUri(sourceFileUri)) { + if (!this.checkUri(sourceFileUri)) { return []; } let infos = []; @@ -280,7 +307,6 @@ export default class FileExtAbility extends Extension { mimeType: '', }); } catch (e) { - hilog.error(DOMAIN_CODE, TAG, 'listFile error ' + e.message); hasNextFile = false; } } -- Gitee From c4ceb0264e4fcb79b16a963cbfe9ff52f90f8e6e Mon Sep 17 00:00:00 2001 From: shuzhouhao Date: Fri, 15 Jul 2022 10:43:35 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=8A=B6=E5=86=B5=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: shuzhouhao --- .../FileExtensionAbility.ts | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index 29b95352..0b9012ba 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -106,7 +106,7 @@ export default class FileExtAbility extends Extension { return newFileUri; } - listDir(path, cb) { + recurseDir(path, cb) { try { let stat = fileio.statSync(path); if (stat.isDirectory()) { @@ -116,7 +116,7 @@ export default class FileExtAbility extends Extension { while (hasNextFile) { try { let dirent = dir.readSync(); - this.listDir(path + '/' + dirent.name, cb); + this.recurseDir(path + '/' + dirent.name, cb); } catch (e) { hasNextFile = false; cb(path, true, hasNextFile); @@ -126,7 +126,7 @@ export default class FileExtAbility extends Extension { cb(path, false); } } catch (e) { - hilog.error(DOMAIN_CODE, TAG, 'listDir error ' + e.message); + hilog.error(DOMAIN_CODE, TAG, 'recurseDir error ' + e.message); cb(path, true); } } @@ -192,7 +192,7 @@ export default class FileExtAbility extends Extension { } let path = this.getPath(selectFileUri); let code = 0; - this.listDir(path, function (filePath, isDirectory, hasNextFile) { + this.recurseDir(path, function (filePath, isDirectory, hasNextFile) { try { if (isDirectory) { if (!hasNextFile) { @@ -222,13 +222,27 @@ export default class FileExtAbility extends Extension { } else if (newPath.indexOf(oldPath) == 0) { return ''; } + try { + fileio.accessSync(oldPath); + let stat = fileio.statSync(this.getPath(targetParentUri)); + if (!stat || !stat.isDirectory()) { + return ''; + } + } catch (e) { + hilog.error(DOMAIN_CODE, TAG, 'move error ' + e.message); + return ''; + } let hasError = false; - this.listDir(oldPath, function (filePath, isDirectory, hasNextFile) { + this.recurseDir(oldPath, function (filePath, isDirectory, hasNextFile) { try { let newFilePath = filePath.replace(oldPath, newPath); if (isDirectory) { if (hasNextFile) { - fileio.mkdirSync(newFilePath); + try { + fileio.accessSync(newFilePath); + } catch (e) { + fileio.mkdirSync(newFilePath); + } } else { fileio.rmdirSync(filePath); } @@ -243,9 +257,8 @@ export default class FileExtAbility extends Extension { }); if (hasError) { return ''; - } else { - return newFileUri; } + return newFileUri; } rename(sourceFileUri, displayName) { -- Gitee From 8dd5bb9e01210d7cd5fc839e31d5f374a09e68f5 Mon Sep 17 00:00:00 2001 From: shuzhouhao Date: Tue, 19 Jul 2022 10:57:35 +0800 Subject: [PATCH 3/3] add comments Signed-off-by: shuzhouhao --- .../ets/FileExtensionAbility/FileExtensionAbility.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index 0b9012ba..4e357666 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -218,11 +218,14 @@ export default class FileExtAbility extends Extension { let oldPath = this.getPath(sourceFileUri); let newPath = this.getPath(newFileUri); if (oldPath == newPath) { + // move to the same directory return newFileUri; } else if (newPath.indexOf(oldPath) == 0) { + // move to a subdirectory of the source directory return ''; } try { + // The source file does not exist or the destination is not a directory fileio.accessSync(oldPath); let stat = fileio.statSync(this.getPath(targetParentUri)); if (!stat || !stat.isDirectory()) { @@ -233,12 +236,19 @@ export default class FileExtAbility extends Extension { return ''; } let hasError = false; + /** + * Recursive source directory + * If it is a directory, create a new directory first and then delete the source directory. + * If it is a file, copy the file first and then delete the source file. + * The source directory will be deleted after the sub files are deleted + */ this.recurseDir(oldPath, function (filePath, isDirectory, hasNextFile) { try { let newFilePath = filePath.replace(oldPath, newPath); if (isDirectory) { if (hasNextFile) { try { + // If the target directory already has a directory with the same name, it will not be created fileio.accessSync(newFilePath); } catch (e) { fileio.mkdirSync(newFilePath); -- Gitee