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'; 28 29const TAG = 'FileAccessExec'; 30 31namespace FileAccessExec { 32 33 // 创建文件夹 34 export function createFolder(sourceUri: string, folderName: string): any { 35 return new Promise((resolve, reject) => { 36 try { 37 globalThis.fileAcsHelper.mkDir(sourceUri, folderName, (ret, data) => { 38 if (ret && ret.code !== '0') { 39 reject(ret); 40 Logger.e(TAG, 'createFolder fail:' + JSON.stringify(ret)); 41 } else { 42 resolve(data); 43 } 44 }) 45 } catch (error) { 46 reject(error); 47 Logger.e(TAG, 'createFolder error occurred:' + error); 48 } 49 }) 50 } 51 52 // 创建文件 53 export function createFile(sourceUri: string, fileName: string): any { 54 return new Promise((resolve, reject) => { 55 try { 56 globalThis.fileAcsHelper.createFile(sourceUri, fileName, (ret, data) => { 57 if (ret && ret.code !== '0') { 58 reject(ret); 59 Logger.e(TAG, 'createFile fail:' + JSON.stringify(ret)); 60 } else { 61 resolve(data); 62 } 63 }) 64 } catch (error) { 65 reject(error); 66 Logger.e(TAG, 'createFile error occurred:' + error); 67 } 68 }) 69 } 70 71 export function getFileData(): any { 72 let folderList: FilesData[] = []; 73 let fileList: FilesData[] = []; 74 const allData = getRootFolder(); 75 allData.forEach((item) => { 76 if (item.isFolder) { 77 folderList.push(new FilesData({ 78 ...item 79 })); 80 } else { 81 fileList.push(new FilesData({ 82 ...item 83 })); 84 } 85 }) 86 87 return { folderList, fileList }; 88 } 89 90 export function getFileByCurIterator(fileInfo: fileAccess.FileInfo | fileAccess.RootInfo): FilesData[] { 91 let fileList: FilesData[] = []; 92 try { 93 let fileIterator = fileInfo.listFile(); 94 if (!fileIterator) { 95 Logger.w(TAG, 'getFileByCurIterator fail, fileIterator is null'); 96 return fileList; 97 } 98 let result = fileIterator.next(); 99 let isDone = result.done; 100 while (!isDone) { 101 const {fileName, relativePath,uri, mode, size, mtime, mimeType} = result.value; 102 let tempFile = new FilesData({ 103 id: randomId(), 104 fileName, 105 relativePath, 106 uri, 107 mode, 108 size, 109 mtime, 110 mimeType, 111 fileIterator: result.value 112 }); 113 fileList.push(tempFile); 114 result = fileIterator.next(); 115 isDone = result.done; 116 } 117 fileList = sortDataByTime(fileList); 118 } catch (error) { 119 fileList = []; 120 Logger.e(TAG, 'getFileByCurIterator fail, error:' + JSON.stringify(error) + error); 121 } 122 return fileList; 123 } 124 125 export function getPathPickSubFiles(fileInfo: fileAccess.FileInfo, 126 defaultPathPick: string, level: number): FileBase[] { 127 let fileArr: FileBase[] = []; 128 let fileIterator = fileInfo.listFile(); 129 if (!fileIterator) { 130 return fileArr; 131 } 132 let result = fileIterator.next(); 133 let isDone = result.done; 134 while (!isDone) { 135 try { 136 let fileInfo: fileAccess.FileInfo = result.value; 137 if (!ObjectUtil.isNullOrUndefined(fileInfo)) { 138 let tempFile = new FileBase(result.value, false); 139 if (tempFile.isFolder) { 140 if (FileUtil.hasSubFolder(defaultPathPick, tempFile.currentDir) && level <= FOLDER_LEVEL.MAX_LEVEL) { 141 tempFile.subList = getPathPickSubFiles(fileInfo, defaultPathPick, level + 1); 142 } 143 } 144 // 根目录下不显示Documents文件夹 145 fileArr.push(tempFile); 146 } 147 result = fileIterator.next(); 148 isDone = result.done; 149 } catch (e) { 150 Logger.e(TAG, 'getSubFileByIterator error: ' + e.toString()); 151 isDone = true; 152 } 153 } 154 fileArr = sortBaseDataByOrderTime(fileArr, true); 155 return fileArr; 156 } 157 158 159 export function getRootFolder(): FilesData[] { 160 let fileList: FilesData[] = []; 161 if (!globalThis.rootInfoArr) { 162 Logger.e(TAG, 'getRootFolder fail, rootInfoArr is null'); 163 return fileList; 164 } 165 try { 166 const rootFolder: fileAccess.RootInfo = globalThis.rootInfoArr.find( 167 (item: fileAccess.RootInfo) => item.deviceType === fileExtensionInfo.DeviceType.DEVICE_LOCAL_DISK); 168 if (rootFolder) { 169 globalThis.documentInfo = rootFolder; 170 fileList = getFileByCurIterator(rootFolder); 171 fileList = fileList.filter(item => item.fileName !== DESKTOP_FOLDER); 172 } else { 173 Logger.e(TAG, 'rootFolder is null'); 174 } 175 } catch (error) { 176 fileList = []; 177 Logger.e(TAG, 'getRootFolder fail, error:' + JSON.stringify(error) + error); 178 } 179 return fileList; 180 } 181} 182 183export default FileAccessExec;