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