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 5798e8affb6eb8db62801773a08446b9aa60eb31..491f39b68bd1d886a4158d9b6beda992293195ad 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 @@ -19,7 +19,7 @@ import type { Filter } from '@ohos.file.fs'; import fileAccess from '@ohos.file.fileAccess'; import fileExtensionInfo from '@ohos.file.fileExtensionInfo'; import hilog from '@ohos.hilog'; -import { getFileInfos, buildFilterOptions, buildNoFilterOptions, hasFilter } from './ListScanFileInfo'; +import { getListFileInfos, getScanFileInfos, buildFilterOptions, buildNoFilterOptions, hasFilter } from './ListScanFileInfo'; import type { Fileinfo } from './Common'; import { getPath, checkUri, encodePathOfUri, decodeUri, uriReturnObject, BUNDLE_NAME, DOMAIN_CODE, fileinfoReturnObject } from './Common'; import { FILE_PREFIX_NAME, TAG, fdReturnObject, boolReturnObject, rootsReturnObject } from './Common'; @@ -650,7 +650,7 @@ export default class FileExtAbility extends Extension { if (!checkUri(sourceFileUri)) { return infosReturnObject([], E_URIS); } - return getFileInfos(sourceFileUri, offset, count, filter, false); + return getListFileInfos(sourceFileUri, offset, count, filter, false); } scanFile(sourceFileUri: string, offset: number, count: number, filter: Filter) : @@ -661,7 +661,7 @@ export default class FileExtAbility extends Extension { return infosReturnObject([], E_URIS); } - return getFileInfos(sourceFileUri, offset, count, filter, true); + return getScanFileInfos(sourceFileUri, offset, count, filter, true); } getFileInfoFromUri(selectFileUri) { diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts index 24185366e6a47f3eb0a2bf3cabaa8bd827acf932..ba33e37cf436d1441ba00a7d6081d9184871cf41 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts @@ -22,6 +22,8 @@ import { getPath, uriReturnObject, encodePathOfUri, DOMAIN_CODE, TAG, infosRetur const documentFlag = fileExtensionInfo.DocumentFlag; const ERR_OK = 0; const E_GETRESULT = 14300004; +const APP_DATA = 'appdata'; +const CURRENT_USER_PATH = '/storage/Users/currentUser'; function hasFilter(filter: Filter) : boolean { if (filter === null) { @@ -129,7 +131,7 @@ function genNewFileName(filename: string): string { return newFilename; } -function getFileInfos(sourceFileUri: string, offset: number, count: number, filter: Filter, recursion: boolean) : +function getListFileInfos(sourceFileUri: string, offset: number, count: number, filter: Filter, recursion: boolean) : {infos: Fileinfo[], code: number} { let infos : Fileinfo[] = []; let path = getPath(sourceFileUri); @@ -176,4 +178,98 @@ function getFileInfos(sourceFileUri: string, offset: number, count: number, filt } return infosReturnObject(infos, ERR_OK); } -export { getFileInfos, buildFilterOptions, buildNoFilterOptions, hasFilter }; + +function getSubUriList(path: string, listNum: number, filter: Filter) : string[] +{ + let dirOptions = { + 'recursion': false + }; + let fileOption = hasFilter(filter) ? + buildFilterOptions(filter, listNum, false) : buildNoFilterOptions(listNum, false); + let dirTmpResult = fs.listFileSync(path, dirOptions).filter(item => item !== APP_DATA).map(function(item) { + return CURRENT_USER_PATH + '/' + item; + }); + let fileResult = fs.listFileSync(path, fileOption).filter(item => item !== APP_DATA).map(function(item) { + return CURRENT_USER_PATH + '/' + item; + }); + let dirResult : string[] = []; + for (let i = 0; i < dirTmpResult.length; ++i) { + if (fs.statSync(dirTmpResult[i]).isDirectory()) { + dirResult.push(dirTmpResult[i]); + } + } + return Array.from(new Set(fileResult.concat(dirResult))); +} + +function getSubFileInfos( + changeData: { + options: {recursion: boolean, listNum: number, filter?: Filter}, + tempOffset: number, + listNumCnt: number + }, needInfo: {subPath: string, count: number, isRootPath: boolean, sourceFileUri: string}): Fileinfo[] { + let infos: Fileinfo[] = []; + let tmpStat = fs.statSync(needInfo.subPath); + let bIsDct = tmpStat.isDirectory(); + let fileNameList = bIsDct ? fs.listFileSync(needInfo.subPath, changeData.options) : [needInfo.subPath]; + let listLen = fileNameList.length; + if (changeData.tempOffset >= listLen) { + changeData.tempOffset -= listLen; + return infos; + } + for (let j = changeData.tempOffset; j < fileNameList.length; ++j, ++changeData.listNumCnt) { + if (changeData.listNumCnt === needInfo.count) { + break; + } + let mode = documentFlag.SUPPORTS_READ | documentFlag.SUPPORTS_WRITE; + let filePath = getNewPathOrUri(needInfo.subPath, fileNameList[j]); + let stat = bIsDct ? fs.statSync(filePath) : tmpStat; + mode |= (bIsDct | stat.isDirectory()) ? documentFlag.REPRESENTS_DIR : documentFlag.REPRESENTS_FILE; + let newFileUri = getNewPathOrUri( + needInfo.isRootPath ? needInfo.sourceFileUri + needInfo.subPath : needInfo.sourceFileUri, fileNameList[j]); + newFileUri = encodePathOfUri(newFileUri); + infos.push({ uri: newFileUri, relativePath: filePath, fileName: genNewFileName(fileNameList[j]), + mode: mode, size: stat.size, mtime: stat.mtime, mimeType: '' }); + } + changeData.tempOffset = 0; + changeData.options.listNum = needInfo.count - changeData.listNumCnt; + return infos; +} + +function getScanFileInfos(sourceFileUri: string, offset: number, count: number, filter: Filter, recursion: boolean) : +{infos: Fileinfo[], code: number} { + let infos : Fileinfo[] = []; + let path = getPath(sourceFileUri); + try { + let statPath = fs.statSync(path); + if (!statPath.isDirectory()) { + return infosReturnObject([], E_GETRESULT); + } + let listNum = offset + count; + let isRootPath = (path === CURRENT_USER_PATH); + let listInfo = (isRootPath) ? getSubUriList(path, listNum, filter) : [path]; + let changeData = { + options: hasFilter(filter) ? + buildFilterOptions(filter, listNum, recursion) : buildNoFilterOptions(listNum, recursion), + tempOffset: offset, + listNumCnt: 0 + }; + for (let i = 0; i < listInfo.length; ++i) { + const needInfo = { + subPath: listInfo[i], + count: count, + isRootPath: isRootPath, + sourceFileUri: sourceFileUri + }; + let subFileRes = getSubFileInfos(changeData, needInfo); + infos.push(...subFileRes); + if (changeData.options.listNum <= 0) { + break; + } + } + } catch (e) { + hilog.error(DOMAIN_CODE, TAG, `getFileInfos error: ${e.message},code: ${e.code}`); + return infosReturnObject([], E_GETRESULT); + } + return infosReturnObject(infos, ERR_OK); +} +export { getListFileInfos, getScanFileInfos, buildFilterOptions, buildNoFilterOptions, hasFilter };