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, DOCS_FOLDER, 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 fs from '@ohos.file.fs' 29 30const TAG = 'FileAccessExec' 31 32namespace FileAccessExec { 33 34// 创建文件夹 35 export function createFolder(sourceUri: string, folderName: string): any { 36 return new Promise((resolve, reject) => { 37 try { 38 globalThis.fileAcsHelper.mkDir(sourceUri, folderName, (ret, data) => { 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): any { 55 return new Promise((resolve, reject) => { 56 try { 57 globalThis.fileAcsHelper.createFile(sourceUri, fileName, (ret, data) => { 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(): any { 73 let folderList = new Array<FilesData>() 74 let fileList = new Array<FilesData>() 75 const allData = getRootFolder() 76 allData.forEach((item) => { 77 if (item.isFolder) { 78 folderList.push(new FilesData({ 79 ...item 80 })) 81 } else { 82 fileList.push(new FilesData({ 83 ...item 84 })) 85 } 86 }) 87 88 return { folderList, fileList } 89 } 90 91 export function getFileByCurIterator(fileInfo: fileAccess.FileInfo | fileAccess.RootInfo): Array<FilesData> { 92 let fileList: Array<FilesData> = [] 93 try { 94 let fileIterator = fileInfo.listFile() 95 if (!fileIterator) { 96 Logger.w(TAG, 'getFileByCurIterator fail, fileIterator is null') 97 return fileList 98 } 99 let result = fileIterator.next() 100 let isDone = result.done 101 while (!isDone) { 102 const {fileName, relativePath,uri, mode, size, mtime, mimeType} = result.value 103 let tempFile = new FilesData({ 104 id: randomId(), 105 fileName, 106 relativePath, 107 uri, 108 mode, 109 size, 110 mtime, 111 mimeType, 112 fileIterator: result.value 113 }) 114 fileList.push(tempFile) 115 result = fileIterator.next() 116 isDone = result.done 117 } 118 fileList = sortDataByTime(fileList) 119 } catch (error) { 120 fileList = [] 121 Logger.e(TAG, 'getFileByCurIterator fail, error:' + JSON.stringify(error) + error) 122 } 123 return fileList 124 } 125 126 export function getPathPickSubFiles(fileInfo: fileAccess.FileInfo, defaultPathPick: string, level: number): Array<FileBase> { 127 let fileArr: Array<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(): Array<FilesData> { 160 let fileList: Array<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((item: fileAccess.RootInfo) => item.deviceType === fileExtensionInfo.DeviceType.DEVICE_LOCAL_DISK) 167 if (rootFolder) { 168 globalThis.documentInfo = rootFolder 169 fileList = getFileByCurIterator(rootFolder) 170 fileList = fileList.filter(item => item.fileName !== DESKTOP_FOLDER) 171 } else { 172 Logger.e(TAG, 'rootFolder is null') 173 } 174 } catch (error) { 175 fileList = [] 176 Logger.e(TAG, 'getRootFolder fail, error:' + JSON.stringify(error) + error) 177 } 178 return fileList 179 } 180} 181 182 183export default FileAccessExec