1/* 2 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 fileIo from '@ohos.fileio'; 17import fs from '@ohos.file.fs'; 18import fileAccess from '@ohos.file.fileAccess'; 19import Logger from '../common/Logger'; 20import { bufferToString } from '../common/Common'; 21 22const TAG = 'MediaFileUri'; 23const RECENT_MAX = 10; // 最近打开最大文件数 24const BUFFER_SIZE = 4096; // 文件读写缓冲区大小 25const COMMON_FD = -1; // 文件fd默认值 26const MODE_READ_ONLY = 0; 27const MODE_WRITE_ONLY = 1; 28const MODE_READ_WRITE = 2; 29 30export default class MediaFileUri { 31 content: string = ''; 32 private commonFd: number = COMMON_FD; 33 private fileSizeList: Array<number> = []; 34 private fileNameList: Array<string> = []; 35 private fileUriList: Array<string> = []; 36 private fileAccessHelper: fileAccess.FileAccessHelper; 37 private fileInfos: Array<fileAccess.FileInfo> = []; 38 39 constructor() { 40 41 } 42 43 getMode(openFlag: number): number { 44 let mode; 45 switch (openFlag) { 46 case MODE_READ_ONLY: 47 mode = fs.OpenMode.READ_ONLY; // r 48 break; 49 case MODE_WRITE_ONLY: 50 mode = fs.OpenMode.WRITE_ONLY; // w 51 break; 52 case MODE_READ_WRITE: 53 mode = fs.OpenMode.READ_WRITE; // rw 54 break; 55 } 56 return mode; 57 } 58 59 myWriteSync(fd: number, content: string, isClose: boolean): void { 60 try { 61 let result = fs.writeSync(fd, content); 62 Logger.info(TAG, 'myWriteSync: write result = ' + result); 63 } catch (err) { 64 Logger.error(TAG, 'myWriteSync: write failed with error:' + err); 65 } 66 if (isClose) { 67 this.closeSync(fd); 68 this.commonFd = COMMON_FD; 69 } else { 70 this.commonFd = fd; 71 } 72 } 73 74 // sync-close 75 closeSync(fd: number): void { 76 try { 77 fileIo.closeSync(fd); 78 Logger.info(TAG, 'closeSync file finish.'); 79 } catch (err) { 80 Logger.error(TAG, 'closeSync file error = ' + err); 81 } 82 } 83 84 readFileContent(uri: string, isRead: boolean = true, isClose: boolean = true): string { 85 let content = ''; 86 Logger.info(TAG, 'open path = ' + uri); 87 let file; 88 if (isClose || this.commonFd === COMMON_FD) { 89 try { 90 file = fs.openSync(uri, fs.OpenMode.READ_ONLY); 91 Logger.info(TAG, 'openReadSync: get fd success. fd = ' + file.fd); 92 this.commonFd = file.fd; 93 } catch (err) { 94 Logger.error(TAG, 'openReadSync: open file failed. error = ' + err); 95 return content; 96 } 97 if (file === undefined) { 98 Logger.error(TAG, 'openReadSync: open file failed. file = undefined.'); 99 return content; 100 } 101 } 102 if (isRead) { 103 try { 104 let buffer = new ArrayBuffer(BUFFER_SIZE); 105 let readOut = fs.readSync(this.commonFd, buffer, { 106 offset: 0 107 }); 108 content = bufferToString(buffer); 109 Logger.info(TAG, 'myReadSync: read result: ' + String.fromCharCode.apply(null, new Uint8Array(buffer.slice(0, readOut)))); 110 } catch (err) { 111 Logger.error(TAG, 'myReadSync: read error: ' + err); 112 return content; 113 } 114 115 if (isClose) { 116 this.closeSync(this.commonFd); 117 this.commonFd = COMMON_FD; 118 } else { 119 this.commonFd = this.commonFd; 120 } 121 } 122 return content; 123 } 124 125 myGetFileSize(uri: string, mode: number): number { 126 let file = fs.openSync(uri, mode); // fs.OpenMode.READ_ONLY 127 Logger.info(TAG, 'file fd: ' + file.fd); 128 let stat = fs.statSync(file.fd); 129 Logger.info(TAG, 'get file info succeed, the size of file is ' + stat.size); 130 return stat.size; 131 } 132 133 writeFileContent(uri: string, content: string): void { 134 Logger.info(TAG, 'writeFileContent begin'); 135 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); 136 Logger.info(TAG, 'writeFileContent file fd: ' + file.fd); 137 let writeLen = fs.writeSync(file.fd, content); 138 Logger.info(TAG, 'writeFileContent write data to file succeed and size is:' + writeLen); 139 fs.closeSync(file); 140 } 141 142 async getFileData(url: string): Promise<void> { 143 let isDone: boolean = false; 144 let fileInfo = await this.fileAccessHelper.getFileInfoFromUri(url); 145 try { 146 let fileIterator = fileInfo.scanFile({ 147 suffix: ['.txt'] 148 }); 149 if (!fileIterator) { 150 Logger.info(TAG, 'listFile interface returns an undefined object'); 151 } 152 while (!isDone) { 153 let result = fileIterator.next(); 154 isDone = result.done; 155 if (!isDone) { 156 this.fileInfos.push(result.value); 157 } 158 } 159 } catch (err) { 160 Logger.info(TAG, `listFile failed, ${err}`); 161 } 162 } 163 164 async getAllFiles(context): Promise<void> { 165 Logger.info(TAG, 'getAllFiles begin'); 166 this.fileInfos = []; 167 this.fileAccessHelper = fileAccess.createFileAccessHelper(context); 168 let rootIterator = await this.fileAccessHelper.getRoots(); 169 // 获取目录url 170 let catalogueUrl: string = rootIterator.next().value.uri; 171 await this.getFileData(catalogueUrl); 172 for (let index = 0; index < this.fileInfos.length && index < RECENT_MAX; index++) { 173 this.fileNameList[index] = this.fileInfos[index].fileName; 174 this.fileSizeList[index] = this.fileInfos[index].size; 175 this.fileUriList[index] = this.fileInfos[index].uri; 176 } 177 AppStorage.SetOrCreate('fileNameList', this.fileNameList); 178 AppStorage.SetOrCreate('fileSizeList', this.fileSizeList); 179 AppStorage.SetOrCreate('fileUriList', this.fileUriList); 180 } 181}