• 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, DOCS_FOLDER, 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 fs from '@ohos.file.fs'
29
30const TAG = 'FileAccessExec'
31
32namespace FileAccessExec {
33
34// 创建文件夹
35  export function createFolder(sourceUri: string, folderName: string): any {
36    return new Promise((resolve, reject) => {
37      try {
38        globalThis.fileAcsHelper.mkDir(sourceUri, folderName, (ret, data) => {
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): any {
55    return new Promise((resolve, reject) => {
56      try {
57        globalThis.fileAcsHelper.createFile(sourceUri, fileName, (ret, data) => {
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(): any {
73    let folderList = new Array<FilesData>()
74    let fileList = new Array<FilesData>()
75    const allData = getRootFolder()
76    allData.forEach((item) => {
77      if (item.isFolder) {
78        folderList.push(new FilesData({
79          ...item
80        }))
81      } else {
82        fileList.push(new FilesData({
83          ...item
84        }))
85      }
86    })
87
88    return { folderList, fileList }
89  }
90
91  export function getFileByCurIterator(fileInfo: fileAccess.FileInfo | fileAccess.RootInfo): Array<FilesData> {
92    let fileList: Array<FilesData> = []
93    try {
94      let fileIterator = fileInfo.listFile()
95      if (!fileIterator) {
96        Logger.w(TAG, 'getFileByCurIterator fail, fileIterator is null')
97        return fileList
98      }
99      let result = fileIterator.next()
100      let isDone = result.done
101      while (!isDone) {
102        const {fileName, relativePath,uri, mode, size, mtime, mimeType} = result.value
103        let tempFile = new FilesData({
104          id: randomId(),
105          fileName,
106          relativePath,
107          uri,
108          mode,
109          size,
110          mtime,
111          mimeType,
112          fileIterator: result.value
113        })
114        fileList.push(tempFile)
115        result = fileIterator.next()
116        isDone = result.done
117      }
118      fileList = sortDataByTime(fileList)
119    } catch (error) {
120      fileList = []
121      Logger.e(TAG, 'getFileByCurIterator fail, error:' + JSON.stringify(error) + error)
122    }
123    return fileList
124  }
125
126  export function getPathPickSubFiles(fileInfo: fileAccess.FileInfo, defaultPathPick: string, level: number): Array<FileBase> {
127    let fileArr: Array<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(): Array<FilesData> {
160    let fileList: Array<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((item: fileAccess.RootInfo) => item.deviceType === fileExtensionInfo.DeviceType.DEVICE_LOCAL_DISK)
167      if (rootFolder) {
168        globalThis.documentInfo = rootFolder
169        fileList = getFileByCurIterator(rootFolder)
170        fileList = fileList.filter(item => item.fileName !== DESKTOP_FOLDER)
171      } else {
172        Logger.e(TAG, 'rootFolder is null')
173      }
174    } catch (error) {
175      fileList = []
176      Logger.e(TAG, 'getRootFolder fail, error:' + JSON.stringify(error) + error)
177    }
178    return fileList
179  }
180}
181
182
183export default FileAccessExec