• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, 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 { BusinessError } from '@kit.BasicServicesKit';
29
30const TAG = 'FileAccessExec';
31
32namespace FileAccessExec {
33
34  // 创建文件夹
35  export function createFolder(sourceUri: string, folderName: string): ESObject {
36    return new Promise<string>((resolve, reject) => {
37      try {
38        globalThis.fileAcsHelper.mkDir(sourceUri, folderName, (ret: BusinessError, data: string) => {
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): ESObject {
55    return new Promise<string>((resolve, reject) => {
56      try {
57        globalThis.fileAcsHelper.createFile(sourceUri, fileName, (ret: BusinessError, data: string) => {
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(): ESObject {
73    let folderList: FilesData[] = [];
74    let fileList: FilesData[] = [];
75    const allData = getRootFolder();
76    allData.forEach((item) => {
77      if (item.isFolder) {
78        folderList.push(new FilesData(item));
79      } else {
80        fileList.push(new FilesData(item));
81      }
82    })
83
84    return { folderList, fileList };
85  }
86
87  export function getFileByCurIterator(fileInfo: fileAccess.FileInfo | fileAccess.RootInfo): FilesData[] {
88    let fileList: FilesData[] = [];
89    try {
90      let fileIterator = fileInfo.listFile();
91      if (!fileIterator) {
92        Logger.w(TAG, 'getFileByCurIterator fail, fileIterator is null');
93        return fileList;
94      }
95      let result = fileIterator.next();
96      let isDone = result.done;
97      while (!isDone) {
98        const data = result.value;
99        let tempFile = new FilesData();
100        tempFile.id = randomId();
101        tempFile.fileName = data.fileName;
102        tempFile.relativePath = data.relativePath;
103        tempFile.uri = data.uri;
104        tempFile.mode = data.mode.toString();
105        tempFile.size = data.size;
106        tempFile.mtime = data.mtime;
107        tempFile.mimeType = data.mimeType;
108        tempFile.fileIterator = result.value;
109        fileList.push(tempFile);
110        result = fileIterator.next();
111        isDone = result.done;
112      }
113      fileList = sortDataByTime(fileList);
114    } catch (error) {
115      fileList = [];
116      Logger.e(TAG, 'getFileByCurIterator fail, error:' + JSON.stringify(error) + error);
117    }
118    return fileList;
119  }
120
121  export function getPathPickSubFiles(fileInfo: fileAccess.FileInfo,
122                                      defaultPathPick: string, level: number): FileBase[] {
123    let fileArr: FileBase[] = [];
124    let fileIterator = fileInfo.listFile();
125    if (!fileIterator) {
126      return fileArr;
127    }
128    let result = fileIterator.next();
129    let isDone = result.done;
130    while (!isDone) {
131      try {
132        let fileInfo: fileAccess.FileInfo = result.value;
133        if (!ObjectUtil.isNullOrUndefined(fileInfo)) {
134          let tempFile = new FileBase(result.value, false);
135          if (tempFile.isFolder) {
136            if (FileUtil.hasSubFolder(defaultPathPick, tempFile.currentDir) && level <= FOLDER_LEVEL.MAX_LEVEL) {
137              tempFile.subList = getPathPickSubFiles(fileInfo, defaultPathPick, level + 1);
138            }
139          }
140          // 根目录下不显示Documents文件夹
141          fileArr.push(tempFile);
142        }
143        result = fileIterator.next();
144        isDone = result.done;
145      } catch (e) {
146        Logger.e(TAG, 'getSubFileByIterator error: ' + e.toString());
147        isDone = true;
148      }
149    }
150    fileArr = sortBaseDataByOrderTime(fileArr, true);
151    return fileArr;
152  }
153
154
155  export function getRootFolder(): FilesData[] {
156    let fileList: FilesData[] = [];
157    if (!globalThis.rootInfoArr) {
158      Logger.e(TAG, 'getRootFolder fail, rootInfoArr is null');
159      return fileList;
160    }
161    try {
162      const rootFolder: fileAccess.RootInfo = globalThis.rootInfoArr.find(
163        (item: fileAccess.RootInfo) => item.deviceType === fileExtensionInfo.DeviceType.DEVICE_LOCAL_DISK);
164      if (rootFolder) {
165        globalThis.documentInfo = rootFolder;
166        fileList = getFileByCurIterator(rootFolder);
167        fileList = fileList.filter(item => item.fileName !== DESKTOP_FOLDER);
168      } else {
169        Logger.e(TAG, 'rootFolder is null');
170      }
171    } catch (error) {
172      fileList = [];
173      Logger.e(TAG, 'getRootFolder fail, error:' + JSON.stringify(error) + error);
174    }
175    return fileList;
176  }
177}
178
179export default FileAccessExec;