1/* 2 * Copyright (c) 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 16import fs from '@ohos.file.fs'; 17import fileAccess from '@ohos.file.fileAccess'; 18import { BusinessError } from '@ohos.base'; 19import { TestDlpFileInfo } from '../feature/DlpManager'; 20import Logger from '../util/Logger'; 21import common from '@ohos.app.ability.common'; 22import fileUri from '@ohos.file.fileuri'; 23import { PreferencesManager } from './PreferencesManager'; 24 25const TAG = 'FileManager'; 26const RECENT_MAX = 10; // 最近打开最大文件数 27let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 28 29export class FileInfoType { 30 fileUri: string = ''; 31 fileName: string = ''; 32 size: number = 0; 33 isEncryption: boolean = false; 34 35 constructor(fileUri: string, fileName: string, size: number, isEncryption?: boolean) { 36 this.fileUri = fileUri; 37 this.fileName = fileName; 38 this.size = size; 39 } 40} 41 42export class MediaFileUri { 43 private fileAccessHelper: fileAccess.FileAccessHelper = {} as fileAccess.FileAccessHelper; 44 private fileInfos: Array<FileInfoType> = []; 45 46 constructor() { 47 this.fileAccessHelper = fileAccess.createFileAccessHelper(context); 48 } 49 50 // sync-close 51 closeSync(fd: number): void { 52 try { 53 fs.closeSync(fd); 54 Logger.info(TAG, 'closeSync file finish.'); 55 } catch (err) { 56 Logger.error(TAG, 'closeSync file error = ' + err); 57 } 58 } 59 60 myGetFileSize(uri: string, mode: number): number { 61 let file = fs.openSync(uri, mode); // fs.OpenMode.READ_ONLY 62 Logger.info(TAG, `file fd: file.fd`); 63 let stat = fs.statSync(file.fd); 64 Logger.info(TAG, `get file info succeed, the size of file is ${stat.size}`); 65 return stat.size; 66 } 67 68 // 获取文件数据 69 async getFileData(url: string): Promise<void> { 70 let isDone: boolean = false; 71 let fileInfo = await this.fileAccessHelper.getFileInfoFromUri(url); 72 try { 73 let fileIterator = fileInfo.scanFile({ suffix: ['.txt'] }); 74 if (!fileIterator) { 75 Logger.info(TAG, 'listFile interface returns an undefined object'); 76 } 77 while (!isDone) { 78 let result = fileIterator.next(); 79 isDone = result.done; 80 if (!isDone) { 81 let fileMsg: FileInfoType = new FileInfoType(result.value.uri, result.value.fileName, result.value.size); 82 let filterArray: Array<FileInfoType> = this.fileInfos.filter((item) => { 83 return item.fileName === fileMsg.fileName; 84 }) 85 if (filterArray.length > 0) { 86 return; 87 } 88 this.fileInfos.push(fileMsg); 89 } 90 } 91 } catch (err) { 92 Logger.info(TAG, `listFile failed, ${err}`); 93 } 94 } 95 96 // 获取文件 97 async getAllFiles(context: common.UIAbilityContext, dlpFileInfos: Array<TestDlpFileInfo>): Promise<void> { 98 Logger.info(TAG, 'getAllFiles begin'); 99 Logger.info(TAG, 'getAllFiles begin' + JSON.stringify(dlpFileInfos)); 100 this.fileInfos = []; 101 let rootIterator = await this.fileAccessHelper.getRoots(); 102 // 获取目录url 103 let catalogueUrl: string = rootIterator.next().value.uri; 104 await this.getFileData(catalogueUrl); 105 await this.handleFileData(dlpFileInfos); 106 AppStorage.set('fileInfos', this.fileInfos); 107 } 108 109 // 处理文件数据 110 async handleFileData(dlpFileInfos: Array<TestDlpFileInfo>) { 111 if (dlpFileInfos.length > 0) { 112 for (let index = 0; index < this.fileInfos.length && index < RECENT_MAX; index++) { 113 dlpFileInfos.forEach(async (item: TestDlpFileInfo, ind: number) => { 114 let uriInfo: fileUri.FileUri = await this.getFileName(item.plaintextPath); 115 let fileInfo: FileInfoType = this.fileInfos[index]; 116 if (uriInfo.name === fileInfo.fileName) { 117 fileInfo.isEncryption = true; 118 } 119 }) 120 } 121 } 122 } 123 124 // 删除文件 125 async deleteFile(uri: string) { 126 Logger.info(`deleteFile start, uri is ${uri}`); 127 try { 128 let code = await this.fileAccessHelper.delete(uri); 129 if (code !== 0) { 130 Logger.error(`delete failed, code:${code}`); 131 } 132 } catch (err) { 133 let error: BusinessError = err as BusinessError; 134 Logger.error(`delete failed, errCode:${error.code}`); 135 } 136 } 137 138 // 根据Uri获取名称 139 async getFileName(uri: string) { 140 let uriInfo: fileUri.FileUri = new fileUri.FileUri(uri); 141 return uriInfo; 142 } 143 144 // 新增文件 145 async createFile(sourceUri: string, displayName: string): Promise<number> { 146 Logger.info(`SourceUri:${sourceUri}----displayName:${displayName}`); 147 try { 148 // fileAccessHelper 参考 fileAccess.createFileAccessHelper 示例代码获取 149 let fileUri = await this.fileAccessHelper.createFile(sourceUri, displayName); 150 let file = fs.openSync(fileUri, fs.OpenMode.READ_WRITE); 151 Logger.info('the fd is ' + file.fd); 152 return file.fd; 153 } catch (err) { 154 let error: BusinessError = err as BusinessError; 155 Logger.error(`createFile failed, errCode:${error.code}, errMessage:${error.message}`); 156 return -1; 157 } 158 } 159}