1/* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16/** 17 * FileAccessManager删除、复制、移动、重命名等操作 18 */ 19import Logger from '../log/Logger'; 20import { FilesData } from '../../databases/model/FileData'; 21import { FOLDER_LEVEL, DESKTOP_FOLDER } from '../constants/Constant'; 22import { sortDataByTime, randomId, sortBaseDataByOrderTime } from './Tools'; 23import fileAccess from '@ohos.file.fileAccess'; 24import fileExtensionInfo from '@ohos.file.fileExtensionInfo'; 25import { FileBase } from '../../databases/model/base/FileBase'; 26import ObjectUtil from './ObjectUtil'; 27import { FileUtil } from './FileUtil'; 28import { BusinessError } from '@kit.BasicServicesKit'; 29 30const TAG = 'FileAccessExec'; 31 32namespace FileAccessExec { 33 34 // 创建文件夹 35 export function createFolder(sourceUri: string, folderName: string): ESObject { 36 return new Promise<string>((resolve, reject) => { 37 try { 38 globalThis.fileAcsHelper.mkDir(sourceUri, folderName, (ret: BusinessError, data: string) => { 39 if (ret && ret.code !== 0) { 40 reject(ret); 41 Logger.e(TAG, 'createFolder fail:' + JSON.stringify(ret)); 42 } else { 43 resolve(data); 44 } 45 }) 46 } catch (error) { 47 reject(error); 48 Logger.e(TAG, 'createFolder error occurred:' + error); 49 } 50 }) 51 } 52 53 // 创建文件 54 export function createFile(sourceUri: string, fileName: string): ESObject { 55 return new Promise<string>((resolve, reject) => { 56 try { 57 globalThis.fileAcsHelper.createFile(sourceUri, fileName, (ret: BusinessError, data: string) => { 58 if (ret && ret.code !== 0) { 59 reject(ret); 60 Logger.e(TAG, 'createFile fail:' + JSON.stringify(ret)); 61 } else { 62 resolve(data); 63 } 64 }) 65 } catch (error) { 66 reject(error); 67 Logger.e(TAG, 'createFile error occurred:' + error); 68 } 69 }) 70 } 71 72 export function getFileData(): ESObject { 73 let folderList: FilesData[] = []; 74 let fileList: FilesData[] = []; 75 const allData = getRootFolder(); 76 allData.forEach((item) => { 77 if (item.isFolder) { 78 folderList.push(new FilesData(item)); 79 } else { 80 fileList.push(new FilesData(item)); 81 } 82 }) 83 84 return { folderList, fileList }; 85 } 86 87 export function getFileByCurIterator(fileInfo: fileAccess.FileInfo | fileAccess.RootInfo): FilesData[] { 88 let fileList: FilesData[] = []; 89 try { 90 let fileIterator = fileInfo.listFile(); 91 if (!fileIterator) { 92 Logger.w(TAG, 'getFileByCurIterator fail, fileIterator is null'); 93 return fileList; 94 } 95 let result = fileIterator.next(); 96 let isDone = result.done; 97 while (!isDone) { 98 const data = result.value; 99 let tempFile = new FilesData(); 100 tempFile.id = randomId(); 101 tempFile.fileName = data.fileName; 102 tempFile.relativePath = data.relativePath; 103 tempFile.uri = data.uri; 104 tempFile.mode = data.mode.toString(); 105 tempFile.size = data.size; 106 tempFile.mtime = data.mtime; 107 tempFile.mimeType = data.mimeType; 108 tempFile.fileIterator = result.value; 109 fileList.push(tempFile); 110 result = fileIterator.next(); 111 isDone = result.done; 112 } 113 fileList = sortDataByTime(fileList); 114 } catch (error) { 115 fileList = []; 116 Logger.e(TAG, 'getFileByCurIterator fail, error:' + JSON.stringify(error) + error); 117 } 118 return fileList; 119 } 120 121 export function getPathPickSubFiles(fileInfo: fileAccess.FileInfo, 122 defaultPathPick: string, level: number): FileBase[] { 123 let fileArr: FileBase[] = []; 124 let fileIterator = fileInfo.listFile(); 125 if (!fileIterator) { 126 return fileArr; 127 } 128 let result = fileIterator.next(); 129 let isDone = result.done; 130 while (!isDone) { 131 try { 132 let fileInfo: fileAccess.FileInfo = result.value; 133 if (!ObjectUtil.isNullOrUndefined(fileInfo)) { 134 let tempFile = new FileBase(result.value, false); 135 if (tempFile.isFolder) { 136 if (FileUtil.hasSubFolder(defaultPathPick, tempFile.currentDir) && level <= FOLDER_LEVEL.MAX_LEVEL) { 137 tempFile.subList = getPathPickSubFiles(fileInfo, defaultPathPick, level + 1); 138 } 139 } 140 // 根目录下不显示Documents文件夹 141 fileArr.push(tempFile); 142 } 143 result = fileIterator.next(); 144 isDone = result.done; 145 } catch (e) { 146 Logger.e(TAG, 'getSubFileByIterator error: ' + e.toString()); 147 isDone = true; 148 } 149 } 150 fileArr = sortBaseDataByOrderTime(fileArr, true); 151 return fileArr; 152 } 153 154 155 export function getRootFolder(): FilesData[] { 156 let fileList: FilesData[] = []; 157 if (!globalThis.rootInfoArr) { 158 Logger.e(TAG, 'getRootFolder fail, rootInfoArr is null'); 159 return fileList; 160 } 161 try { 162 const rootFolder: fileAccess.RootInfo = globalThis.rootInfoArr.find( 163 (item: fileAccess.RootInfo) => item.deviceType === fileExtensionInfo.DeviceType.DEVICE_LOCAL_DISK); 164 if (rootFolder) { 165 globalThis.documentInfo = rootFolder; 166 fileList = getFileByCurIterator(rootFolder); 167 fileList = fileList.filter(item => item.fileName !== DESKTOP_FOLDER); 168 } else { 169 Logger.e(TAG, 'rootFolder is null'); 170 } 171 } catch (error) { 172 fileList = []; 173 Logger.e(TAG, 'getRootFolder fail, error:' + JSON.stringify(error) + error); 174 } 175 return fileList; 176 } 177} 178 179export default FileAccessExec;