• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}