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