99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙開(kāi)發(fā)實(shí)戰(zhàn):【文件管理】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-20 21:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

介紹

本示例主要展示了文件管理相關(guān)的功能,使用[@ohos.multimedia.medialibrary]、[@ohos.filemanagement.userFileManager] 、[@ohos.fileio] 、[@ohos.file.fs]、[@ohos.app.ability.contextConstant]

接口,實(shí)現(xiàn)了增添文件、刪除文件、查找指定類(lèi)型文件文件、復(fù)制并移動(dòng)文件、切換加密分區(qū)和預(yù)覽圖片、監(jiān)聽(tīng)文件的功能;

效果預(yù)覽

image.png

使用說(shuō)明

  1. 在主界面,可以點(diǎn)擊圖片、視頻、文檔、音頻等按鈕進(jìn)入對(duì)應(yīng)目錄的文件列表瀏覽界面;
  2. 在文檔列表瀏覽界面,點(diǎn)擊“+”按鈕,可以添加文件;
  3. 在文檔列表瀏覽界面,長(zhǎng)按列表項(xiàng)會(huì)出現(xiàn)刪除圖片,點(diǎn)擊刪除圖標(biāo)可以刪除文件;
  4. 在圖片文件列表界面,點(diǎn)擊圖片可以進(jìn)入圖片預(yù)覽界面。
  5. 進(jìn)入“我的手機(jī)”頁(yè)面前應(yīng)先安裝[MyPhoneFilePage],在主頁(yè)點(diǎn)擊“我的手機(jī)”,進(jìn)入應(yīng)用目錄下。
    1. 列表的上方是默認(rèn)的EL2加密分區(qū)的應(yīng)用根目錄下文件列表,點(diǎn)擊下方兩個(gè)按鈕“data/app/el3”和“data/app/el4”分別進(jìn)入EL3和EL4加密分區(qū)應(yīng)用根目錄,進(jìn)入后對(duì)文件或文件夾操作與EL2加密分區(qū)相同。
    2. 點(diǎn)擊左下角“新建文件夾”按鈕,在彈窗中輸入文件夾名稱(chēng),點(diǎn)擊彈窗中的“確定”按鈕,完成創(chuàng)建。
    3. 點(diǎn)擊新建的文件夾,進(jìn)入目錄,在新目錄中點(diǎn)擊左下角的“新建文件”,在彈窗的窗口中填寫(xiě)文件名稱(chēng),然后點(diǎn)擊確定,完成創(chuàng)建。
    4. 點(diǎn)擊右上角多選按鈕,選擇需要重命名的文件(僅選中一個(gè)文件時(shí)可用),點(diǎn)擊重命名,在彈窗中修改文件名稱(chēng),點(diǎn)擊“確定”,完成修改。
    5. 點(diǎn)擊右上角多選按鈕,選擇需要復(fù)制和移動(dòng)的文件(可多選,并且不可移動(dòng)到本身的子目錄下),選中后點(diǎn)擊左下角“復(fù)制和移動(dòng)”按鈕,在頁(yè)面中點(diǎn)擊目標(biāo)目錄會(huì)進(jìn)入該目錄,在目標(biāo)目錄下點(diǎn)擊“移動(dòng)到這”按鈕,完成文件復(fù)制和移動(dòng)。
    6. 點(diǎn)擊右上角多選按鈕,選擇需要?jiǎng)h除的文件,選中后點(diǎn)擊右下角“更多”按鈕,彈出的菜單中選擇“刪除”,在彈窗中點(diǎn)擊“刪除”,即可刪除文件。
    7. 點(diǎn)擊右上角多選按鈕,選擇一項(xiàng)需要修改時(shí)間的文件,選中后點(diǎn)擊右下角“更多”按鈕,彈出的菜單中選擇“修改文件(夾)時(shí)間”,在彈窗的文本框中輸入要修改的時(shí)間,點(diǎn)擊“確定”,即可修改文件(夾)時(shí)間。
    8. 點(diǎn)擊單個(gè)文件,可進(jìn)入文件內(nèi)容頁(yè)面,點(diǎn)擊右上角編輯按鈕,進(jìn)入編輯模式編輯、修改文件內(nèi)容,然后點(diǎn)擊右上角的保存按鈕保存對(duì)文件的修改,點(diǎn)擊左上角"X"按鈕退出編輯模式,點(diǎn)擊返回按鈕返回上一頁(yè)。
  6. 在主頁(yè)點(diǎn)擊“監(jiān)聽(tīng)文件”,進(jìn)入文件監(jiān)聽(tīng)頁(yè)面。
    1. 點(diǎn)擊添加監(jiān)聽(tīng)按鈕,選擇IN_CREATE監(jiān)聽(tīng),然后點(diǎn)擊確定按鈕,成功添加IN_CREATE監(jiān)聽(tīng)。
    2. 點(diǎn)擊添加按鈕,成功添加一個(gè)文件,觸發(fā)事件后日志顯示為相應(yīng)日志:event:256,fileName為新增文件的路徑。
    3. 點(diǎn)擊停止監(jiān)聽(tīng)按鈕,選擇IN_CREATE監(jiān)聽(tīng),然后點(diǎn)擊確定按鈕,成功停止IN_CREATE監(jiān)聽(tīng)。
    4. 點(diǎn)擊添加按鈕,成功添加一個(gè)文件,觸發(fā)事件后日志無(wú)變化。
    5. 點(diǎn)擊添加監(jiān)聽(tīng)按鈕,選擇IN_DELETE監(jiān)聽(tīng),然后點(diǎn)擊確定按鈕,成功添加IN_DELETE監(jiān)聽(tīng)。
    6. 選擇要?jiǎng)h除的文件item,左滑后點(diǎn)擊刪除圖標(biāo),成功刪除一個(gè)文件,觸發(fā)事件后日志顯示為相應(yīng)日志:event:512,fileName為刪除文件的路徑。
    7. 點(diǎn)擊停止監(jiān)聽(tīng)按鈕,選擇IN_DELETE監(jiān)聽(tīng),然后點(diǎn)擊確定按鈕,成功停止IN_CREATE監(jiān)聽(tīng)。
    8. 選擇要?jiǎng)h除的文件item,左滑后點(diǎn)擊刪除圖標(biāo),成功刪除一個(gè)文件,觸發(fā)事件后日志無(wú)變化。
    9. 點(diǎn)擊添加監(jiān)聽(tīng)按鈕,選擇IN_MODIFY監(jiān)聽(tīng),然后點(diǎn)擊確定按鈕,成功添加IN_MODIFY監(jiān)聽(tīng)。
    10. 選擇要編輯的文件item,左滑后點(diǎn)擊編輯圖標(biāo),進(jìn)入文件編輯界面,修改文件名和文件內(nèi)容,修改之后點(diǎn)擊保存圖標(biāo),頁(yè)面顯示的文件文件大小發(fā)生變化,然后點(diǎn)擊返回圖標(biāo)后返回文件監(jiān)聽(tīng)界面,查看觸發(fā)事件后日志顯示為相應(yīng)日志:event:2,fileName為修改后文件的路徑。IN_MODIFY監(jiān)聽(tīng)只監(jiān)聽(tīng)文件內(nèi)容是否發(fā)生變化,若單獨(dú)修改文件名,則不會(huì)更新監(jiān)聽(tīng)日志。
    11. 點(diǎn)擊停止監(jiān)聽(tīng)按鈕,選擇IN_MODIFY監(jiān)聽(tīng),然后點(diǎn)擊確定按鈕,成功停止IN_MODIFY監(jiān)聽(tīng)。
    12. 選擇要編輯的文件item,左滑后點(diǎn)擊編輯圖標(biāo),進(jìn)入文件編輯界面,修改文件名和文件內(nèi)容,修改之后點(diǎn)擊保存圖標(biāo),頁(yè)面顯示的文件文件大小發(fā)生變化,然后點(diǎn)擊返回圖標(biāo)后返回文件監(jiān)聽(tīng)界面,查看觸發(fā)事件后日志無(wú)變化。

具體實(shí)現(xiàn):

  • 增添文件、刪除文件、查找指定類(lèi)型文件文件和預(yù)覽圖片的功能接口封裝在MediaLibraryManager,源碼參考:[MediaLibraryManager.ts]
/*

 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import image from '@ohos.multimedia.image'

import mediaLibrary from '@ohos.multimedia.mediaLibrary'

import Logger from '../../utils/Logger'

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

import type { Permissions } from '@ohos.abilityAccessCtrl';



/**

 * 主要封裝了mediaLibrary庫(kù)相關(guān)的接口

 */

class MediaLibraryManager {

  requestPermission(context): void {

    let permissions: Array< Permissions > = [

      'ohos.permission.READ_MEDIA',

      'ohos.permission.WRITE_MEDIA'

    ]

    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();

    atManager.requestPermissionsFromUser(context, permissions, (code, result) = > {

      Logger.debug('permissionRequest ' + JSON.stringify(code) + ' Result: ' + JSON.stringify(result))

    })

  }



  async getPixelMapByFileAsset(fileAsset: mediaLibrary.FileAsset): Promise< image.PixelMap > {

    if (fileAsset == undefined) {

      Logger.error('fileAsset undefined')

      // 異常情況下統(tǒng)一返回undefined,不建議使用null

      return undefined

    }

    Logger.debug('begin getPixelMapByFileAsset:' + fileAsset.displayName)

    let fd: number = undefined

    let pixelMap = undefined

    try {

      fd = await fileAsset.open('rw')

      Logger.debug('getPixelMapByFileAsset fd: ' + fd)

      let imageSource = image.createImageSource(fd)

      Logger.debug('imageSource: ' + JSON.stringify(imageSource))

      let decodingOptions = {

        sampleSize: 1,

        editable: true,

        desiredSize: { width: 3000, height: 4000 },

        rotate: 0,

        desiredPixelFormat: 3,

        desiredRegion: { size: { height: 6000, width: 8000 }, x: 0, y: 0 },

        index: 0

      }

      pixelMap = await imageSource.createPixelMap(decodingOptions)

      Logger.debug('pixel size: ' + pixelMap.getPixelBytesNumber())

      fileAsset.close(fd)

    } catch (err) {

      Logger.debug('err: ' + JSON.stringify(err))

    }

    return pixelMap

  }



  getMediaLibrary(context): mediaLibrary.MediaLibrary {

    return mediaLibrary.getMediaLibrary(context)

  }



  async getFileAssets(context, fileType: mediaLibrary.MediaType): Promise< mediaLibrary.FetchFileResult > {

    Logger.debug('begin getFileAssets, fileType:' + fileType)

    let fileKeyObj = mediaLibrary.FileKey

    let imagesFetchOption = {

      selections: fileKeyObj.MEDIA_TYPE + '= ?',

      selectionArgs: [fileType.toString()],

    }

    let fetchFileResult: mediaLibrary.FetchFileResult = undefined

    try {

      fetchFileResult = await this.getMediaLibrary(context).getFileAssets(imagesFetchOption)

      Logger.debug('fetchFileResult count:' + fetchFileResult.getCount())

    } catch (error) {

      Logger.error('fetchFileResult Error: ' + JSON.stringify(error))

    }

    return fetchFileResult

  }



  async getFileAssetsByName(context, name: string): Promise< mediaLibrary.FileAsset > {

    Logger.debug('begin getFileAssetsByName: ' + name)

    let fileKeyObj = mediaLibrary.FileKey

    let imagesFetchOption = {

      selections: fileKeyObj.DISPLAY_NAME + '= ?',

      selectionArgs: [name.toString()],

    }

    let fetchFileResult: mediaLibrary.FetchFileResult = undefined

    let file: mediaLibrary.FileAsset = undefined

    try {

      fetchFileResult = await this.getMediaLibrary(context).getFileAssets(imagesFetchOption)

      Logger.debug('fetchFileResult count:' + fetchFileResult.getCount())

      file = await fetchFileResult.getFirstObject()

    } catch (error) {

      Logger.error('fetchFileResult Error: ' + JSON.stringify(error))

    }

    return file

  }



  async getThumbnail(fileAsset: mediaLibrary.FileAsset): Promise< image.PixelMap > {

    let thumbnail = undefined

    try {

      thumbnail = await fileAsset.getThumbnail()

      Logger.debug('PixelMap size: ' + thumbnail.getPixelBytesNumber())

    } catch (error) {

      Logger.error('getThumbnail Error: ' + JSON.stringify(error))

    }

    return thumbnail

  }



  async createFileAsset(context, mediaType: mediaLibrary.MediaType,

                        dir: mediaLibrary.DirectoryType, fileName: string): Promise< mediaLibrary.FileAsset > {

    Logger.debug('createFileAsset: ' + fileName)

    let media = this.getMediaLibrary(context)

    let path = await media.getPublicDirectory(dir)

    return await media.createAsset(mediaType, fileName, path)

  }



  async deleteFileAsset(fileAsset: mediaLibrary.FileAsset): Promise< void > {

    Logger.debug('deleteFileAsset:' + fileAsset.displayName);

    await fileAsset.trash(true);

  }

}



export default new MediaLibraryManager()
  • 使用mediaLibrary.getMediaLibrary來(lái)獲取MediaLibrary對(duì)象;
  • 讀取每個(gè)文件的數(shù)據(jù):使用MediaLibrary.getFileAssets讀取滿(mǎn)足條件的文件集合FetchFileResult,然后調(diào)用FetchFileResult.getFirstObject();
  • 創(chuàng)建模擬文件:使用MediaLibrary.getPublicDirectory()獲取系統(tǒng)預(yù)定的目錄,然后使用MediaLibrary.createAsset();
  • 刪除指定路徑的文件:使用MediaLibrary.deleteAsset();
  • 獲取預(yù)覽圖:使用image.createImageSource()創(chuàng)建指定的文件資源ImageSource,然后調(diào)用ImageSource.createPixelMap(),接口參考:[@ohos.multimedia.image] 。
  • MyPhone模塊中的文件增刪、復(fù)制移動(dòng)、查找功能封裝在FileSystem,源碼參考:[FileIoManager.ets]。
/*

 * Copyright (c) 2023 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import storageStatistics from '@ohos.file.storageStatistics';

import fileio from '@ohos.fileio';

import prompt from '@ohos.promptAction';

import { BusinessError } from '@ohos.base';

import Logger from '../../utils/Logger';

import { FileType, SubDirectoryType } from '../../mock/local/FileData';



// 大小和單位

const GB_MAGNITUDE: number = 1024 * 1024 * 1024;

const MB_MAGNITUDE: number = 1024 * 1024;

const KB_MAGNITUDE: number = 1024;

const GB_SYMBOL: string = 'GB';

const MB_SYMBOL: string = 'MB';

const KB_SYMBOL: string = 'KB';

const BYTE_SYMBOL: string = 'B';



const TAG: string = 'FileIoManager';



class FileSystem {

  // 獲取文件大小

  getFileSize(filePath: string): string {

    try {

      let fileSize = fileio.statSync(filePath).size;

      if (fileSize / GB_MAGNITUDE > 1) {

        return `${(fileSize / GB_MAGNITUDE).toFixed(2)}${GB_SYMBOL}`;

      } else if (fileSize / MB_MAGNITUDE > 1) {

        return `${(fileSize / MB_MAGNITUDE).toFixed(2)}${MB_SYMBOL}`;

      } else if (fileSize / KB_MAGNITUDE > 1) {

        return `${(fileSize / KB_MAGNITUDE).toFixed(2)}${KB_SYMBOL}`;

      } else {

        return `${fileSize}${BYTE_SYMBOL}`;

      }

    } catch (err) {

      Logger.error(TAG, `getFileSize failed, code is ${err.code}, message is ${err.message}`);

      throw new Error(`getFileSize failed, code is ${err.code}, message is ${err.message}`);

    }

  }



/*

  // 總空間---默認(rèn)GB

  async getTotalSize(): Promise< string > {

    let totalSize: number;

    try {

      totalSize = await storageStatistics.getTotalSize();

    } catch (err) {

      let error: BusinessError = err as BusinessError;

      Logger.error(TAG, `getTotalSize failed, code is ${error.code}, message is ${error.message}`);

      throw new Error(`getTotalSize failed, code is ${error.code}, message is ${error.message}`);

    }

    return `${(totalSize / GB_MAGNITUDE).toFixed(2)}${GB_SYMBOL}`;

  }



  // 剩余空間

  async getFreeSize(): Promise< string > {

    let freeSize: number;

    try {

      freeSize = await storageStatistics.getFreeSize();

    } catch (err) {

      let error: BusinessError = err as BusinessError;

      Logger.error(TAG, `getFreeSize failed, code is ${error.code}, message is ${error.message}`);

      throw new Error(`getFreeSize failed, code is ${error.code}, message is ${error.message}`);

    }



    if (freeSize / GB_MAGNITUDE > 1) {

      return `${(freeSize / GB_MAGNITUDE).toFixed(2)}${GB_SYMBOL}`;

    } else if (freeSize / MB_MAGNITUDE > 1) {

      return `${(freeSize / MB_MAGNITUDE).toFixed(2)}${MB_SYMBOL}`;

    } else if (freeSize / KB_MAGNITUDE > 1) {

      return `${(freeSize / KB_MAGNITUDE).toFixed(2)}${KB_SYMBOL}`;

    } else {

      return `${freeSize}${BYTE_SYMBOL}`;

    }

  }

*/



  // 根據(jù)沙箱路徑打開(kāi)目錄

  getSubdirectory(filePath: string): Array< SubDirectoryType > {

    // 獲取目錄

    let dir: fileio.Dir;

    try {

      dir = fileio.opendirSync(filePath);

    } catch (err) {

      let error: BusinessError = err as BusinessError;

      Logger.error(TAG, `Open dir of path ${filePath} failed. error code is ${error.code}, message is ${error.message}`);

      throw new Error(`Open dir of path ${filePath} failed, code is ${error.code}, message is ${error.message}`);

    }

    // 讀取的結(jié)果

    let dirent: fileio.Dirent;

    // 結(jié)果數(shù)組

    class SubDirectory {

      name: string = '';

      type: number = 0;

      time: Date;

      childrenNum: number = 0;

      fileSize: string = '';

      constructor(time: Date) {

        this.time = time;

      }

    }

    let subdirectory: Array< SubDirectory > = []

    do {

      dirent = dir.readSync();

      if (dirent) {

        let subdirectoryNum: number = 0;

        let fileSize: string = '';

        let time: Date = new Date();

        // 如果是文件夾,就讀取文件夾中文件的數(shù)量

        if (dirent.isDirectory()) {

          subdirectoryNum = this.getSubdirectoryNum(filePath + `${dirent.name}`);

          time = this.getFileTime(filePath + `${dirent.name}`);

        } else {

          // 如果不是文件夾,就讀取文件大小和時(shí)間

          fileSize = this.getFileSize(filePath + `${dirent.name}`);

          time = this.getFileTime(filePath + `${dirent.name}`);

        }

        let item = new SubDirectory(time);

        item.name = dirent.name;

        item.type = dirent.isDirectory() ? 1 : 2;

        item.childrenNum = subdirectoryNum;

        item.fileSize = fileSize;

        subdirectory.push(item);

      }

    } while (dirent);

    return subdirectory;

  }



  // 獲取目錄中的子目錄個(gè)數(shù)

  getSubdirectoryNum(filePath: string): number {

    let dir: fileio.Dir;

    try {

      dir = fileio.opendirSync(filePath);

    } catch (err) {

      let error: BusinessError = err as BusinessError;

      Logger.error(TAG, `Open dir of path ${filePath} failed. error code is ${error.code}, message is ${error.message}`);

      throw new Error(`Open dir of path ${filePath} failed, code is ${error.code}, message is ${error.message}`);

    }

    // 讀取的結(jié)果

    let dirent: fileio.Dirent;

    // 記錄子目錄的個(gè)數(shù)

    let subdirectoryNum = 0;

    do {

      dirent = dir.readSync();

      if (dirent) {

        subdirectoryNum++;

      }

    } while (dirent);

    return subdirectoryNum;

  }



  // 獲取文件修改時(shí)間

  getFileTime(filePath: string): Date {

    try {

      let fileTime = fileio.statSync(filePath).mtime;

      return new Date(fileTime * 1000);

    } catch (err) {

      Logger.error(TAG, `getFileTime failed, code is ${err.code}, message is ${err.message}`);

      throw new Error(`getFileTime failed, code is ${err.code}, message is ${err.message}`);

    }

  }



  // 創(chuàng)建目錄

  createDirectory(filePath: string): void {

    try {

      fileio.mkdirSync(filePath);

    } catch (err) {

      Logger.error(TAG, `create directory failed, code is ${err.code}, message is ${err.message}`);

    }

  }



  // 創(chuàng)建文件

  createFile(filePath: string): void {

    try {

      fileio.openSync(filePath, 0o100, 0o666);

    } catch (err) {

      Logger.error(TAG, `create file failed, code is ${err.code}, message is ${err.message}`);

    }

  }



  // 刪除目錄和文件---選中項(xiàng)

  deleteSelected(dataArray: Map< string, number >): void {

    try {

      dataArray.forEach((value, data) = > {

        if (value === 1) {

          fileio.rmdirSync(data);

        } else {

          fileio.unlinkSync(data);

        }})

      prompt.showToast({ message: $r('app.string.label_delete_success') });

    } catch (err) {

      Logger.error(TAG, `delete failed, code is ${err.code}, message is ${err.message}`);

    }

  }



  // 復(fù)制文件

  copyFile(filePath: string, newFilePath: string): void {

    try {

      // 遍歷數(shù)據(jù)直接copy所有項(xiàng)目

      fileio.copyFileSync(filePath, newFilePath);

    } catch (err) {

      Logger.error(TAG, `copy file failed, code is ${err.code}, message is ${err.message}`);

    }

  }



  // 重命名文件

  renameFile(filePath: string, newFilePath: string): void {

    try {

      fileio.renameSync(filePath, newFilePath);

    } catch (err) {

      Logger.error(TAG, `rename file failed, code is ${err.code}, message is ${err.message}`);

    }

  }



  // 開(kāi)始移動(dòng)文件

  startMoveFile(needMoveFiles: Array< FileType >, newFilePath: string): void {

    // 遍歷數(shù)據(jù)

    needMoveFiles.forEach((file: FileType): void = > {

      // 如果是目錄

      if (file.type === 1) {

        // 先創(chuàng)建這個(gè)目錄

        this.createDirectory(`${newFilePath}/${file.fileName}`);

        // 獲取當(dāng)前文件夾下的所有文件目錄

        let subdirectory = this.getSubdirectory(`${file.filePath}/`);

        // 處理為我們想要的格式

        let needMoveFiles: Array< FileType > = [];

        // 遍歷子目錄數(shù)據(jù)

        subdirectory.forEach((subdirectoryData: SubDirectoryType) = > {

          let data: FileType = {

            filePath: `${file.filePath}/${subdirectoryData.name}`,

            fileName: subdirectoryData.name,

            type: subdirectoryData.type

          };

          // 逐一添加進(jìn)去

          needMoveFiles.push(data);

        })

        // 使用我們的數(shù)據(jù)遞歸

        this.startMoveFile(needMoveFiles, `${newFilePath}/${file.fileName}`);

      } else {

        this.copyFile(file.filePath, `${newFilePath}/${file.fileName}`);

      }

    })

  }

}



export default new FileSystem();
  • 讀取文件列表:使用fileio.opendirSync()打開(kāi)指定目錄dir,然后使用dir.readSync()讀取文件內(nèi)容dirent,在調(diào)用dirent中相關(guān)api獲取想要的文件參數(shù);
  • 創(chuàng)建目錄:使用fileio.mkdirSync()創(chuàng)建文件夾;
  • 創(chuàng)建文件:使用fileio.openSync()創(chuàng)建文件;
  • 刪除選中內(nèi)容:使用fileio.rmdirSync()刪除文件夾,使用fileio.unlinkSync()刪除文件;
  • 復(fù)制文件:使用fileio.copyFileSync()復(fù)制目標(biāo)文件;
  • 移動(dòng)文件:使用fileio.mkdirSync()創(chuàng)建指定目錄,再遞歸選中目錄中的文件,將內(nèi)部的文件創(chuàng)建到指定的位置。
  • 修改加密分區(qū):修改應(yīng)用上下文Context的area,實(shí)現(xiàn)當(dāng)前加密分區(qū)的修改。
  • 在Library模塊中通過(guò)封裝FileManager向外提供功能接口,如MediaLibraryManager.getPixelMapByFileAsset(),源碼參考:[FileManager.ts]
/*

 * Copyright (c) 2022 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import mediaLibrary from '@ohos.multimedia.mediaLibrary'

import image from '@ohos.multimedia.image'

import MediaLibraryManager from './medialibrary/MediaLibraryManager'

import LocalMockData from '../mock/local/LocalMockData'



/**

 * 文件管理接口,統(tǒng)一封裝了各模塊對(duì)外提供的功能接口

 */

class FileManager {

  /**

   * 申請(qǐng)文件管理權(quán)限

   * @param context 上下文對(duì)象

   */

  requestPermission(context): void {

    MediaLibraryManager.requestPermission(context)

  }



  /**

   * 通過(guò)傳入文件對(duì)象FileAsset,獲取到文件中的圖片PixelMap對(duì)象

   * @param fileAsset 文件對(duì)象

   * @return Promise< image.PixelMap > 返回PixelMap對(duì)象

   */

  async getPixelMapByFileAsset(fileAsset: mediaLibrary.FileAsset): Promise< image.PixelMap > {

    return await MediaLibraryManager.getPixelMapByFileAsset(fileAsset)

  }



  /**

   * 通過(guò)傳入文件類(lèi)型,獲取到不同的文件列表信息

   * @param context 上下文對(duì)象

   * @param fileType 文件類(lèi)型

   * @return Promise< mediaLibrary.FetchFileResult > 返回文件列表信息

   */

  async getFileAssets(context, fileType: mediaLibrary.MediaType): Promise< mediaLibrary.FetchFileResult > {

    return await MediaLibraryManager.getFileAssets(context, fileType)

  }



  /**

   * 通過(guò)文件名稱(chēng)獲取文件對(duì)象

   * @param context 上下文對(duì)象

   * @param name 文件名稱(chēng)

   * @return Promise< mediaLibrary.FileAsset > 返回文件對(duì)象信息

   */

  async getFileAssetsByName(context, name: string): Promise< mediaLibrary.FileAsset > {

    return await MediaLibraryManager.getFileAssetsByName(context, name)

  }



  /**

   * 獲取文件縮略圖

   * @param fileAsset 文件對(duì)象

   * @return Promise< image.PixelMap > 返回縮略圖信息

   */

  async getThumbnail(fileAsset: mediaLibrary.FileAsset): Promise< image.PixelMap > {

    return await MediaLibraryManager.getThumbnail(fileAsset)

  }



  /**

   * 創(chuàng)建文件

   * @param context 上下文對(duì)象

   * @param mediaType 文件類(lèi)型

   * @param dir 文件路徑

   * @param fileName 文件名稱(chēng)

   * @return Promise< mediaLibrary.FileAsset > 返回匹配的文件信息

   */

  async createFileAsset(context, mediaType: mediaLibrary.MediaType,

                        dir: mediaLibrary.DirectoryType, fileName: string): Promise< mediaLibrary.FileAsset > {

    return await MediaLibraryManager.createFileAsset(context, mediaType, dir, fileName)

  }



  /**

   * 刪除文件

   * @param fileAsset 文件對(duì)象

   */

  async deleteFileAsset(fileAsset: mediaLibrary.FileAsset): Promise< void > {

    await MediaLibraryManager.deleteFileAsset(fileAsset);

  }



  /**

   * 創(chuàng)建模擬文件

   * @param context 上下文對(duì)象

   * @param mediaType 文件類(lèi)型

   * @return Promise< mediaLibrary.FileAsset > 返回文件對(duì)象

   */

  async createTxtFileAsset(context): Promise< mediaLibrary.FileAsset > {

    return await LocalMockData.createFileAsset(context)

  }



  /**

   * 該文件是否支持預(yù)覽

   * @param fileName 文件名

   * @return boolean ture表示支持,false表示不支持

   */

  isSupportPreview(fileName: string): boolean {

    return LocalMockData.isSupportPreview(fileName)

  }

}



export default new FileManager()
  • 如效果預(yù)覽中的 圖片列表 ,讀取指定類(lèi)型的文件:在[FileList.ets]中調(diào)用FileManager.getFileAssets();
  • 創(chuàng)建模擬文件:在[FileList.ets] 中調(diào)用FileManager.createTxtFileAsset();
  • 刪除指定路徑的文件:在[FileList.ets] 中調(diào)用FileManager.deleteFileAsset();
  • 獲取縮略圖:在[ThumbnailImage.ets] 中調(diào)用FileManager.getThumbnail();
  • 如效果預(yù)覽中的 圖片預(yù)覽 ,獲取預(yù)覽圖:在[ImagePreview.ets] 中調(diào)用FileManager.getPixelMapByFileAsset()。
  • 監(jiān)聽(tīng)文件模塊中的文件增刪、查找、修改、監(jiān)聽(tīng)功能封裝在MyWatcher。
  • 增加文件、刪除文件、監(jiān)聽(tīng)文件、停止監(jiān)聽(tīng)文件:在[WatcherFile.ets] 中調(diào)用MyWathcer.addFileToWatcher()、MyWathcer.deleteFileToWatcher()、MyWathcer.startWatcher(watcherName)、MyWathcer.stopWatcher();
  • 修改文件:在[EditFile.ets]

中調(diào)用MyWatcher.modifyFileToWatcher()。

鴻蒙Next技術(shù)知識(shí)已更新[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]請(qǐng)前往參考。

約束與限制

  1. 本示例僅支持標(biāo)準(zhǔn)系統(tǒng)上運(yùn)行,支持設(shè)備:RK3568;
  2. 本示例為Stage模型,僅支持API11版本SDK,SDK版本號(hào)(API Version 11 Beta),鏡像版本號(hào)(4.1Beta)。
  3. 本示例需要使用DevEco Studio 版本號(hào)(4.0Release)及以上版本才可編譯運(yùn)行。
  4. 本示例涉及調(diào)用系統(tǒng)權(quán)限的接口,需要配置允許權(quán)限列表,在配置文件中的“allowed-acls”字段中增加"ohos.permission.READ_MEDIA", "ohos.permission.WRITE_MEDIA", "ohos.permission.FILE_ACCESS_MANAGER", "ohos.permission.STORAGE_MANAGER"四個(gè)權(quán)限。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9005

    瀏覽量

    153773
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2620

    瀏覽量

    44063
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開(kāi)發(fā):【短信服務(wù)】

    數(shù)據(jù)管理 電話(huà)服務(wù) 分布式應(yīng)用開(kāi)發(fā) 通知與窗口管理 多媒體技術(shù) 安全技能 任務(wù)管理 WebGL 國(guó)際化開(kāi)發(fā) 應(yīng)用測(cè)試 DFX面向未來(lái)設(shè)計(jì)
    發(fā)表于 03-03 21:29

    鴻蒙實(shí)戰(zhàn)開(kāi)發(fā)-本地部署、SmartPerf 編譯部署指導(dǎo)文檔

    你們的 『點(diǎn)贊和評(píng)論』,才是我創(chuàng)造的動(dòng)力。 關(guān)注小編,同時(shí)可以期待后續(xù)文章ing?,不定期分享原創(chuàng)知識(shí)。 更多鴻蒙最新技術(shù)知識(shí)點(diǎn),請(qǐng)關(guān)注作者博客:鴻蒙實(shí)戰(zhàn)經(jīng)驗(yàn)分享:鴻蒙基礎(chǔ)入門(mén)
    發(fā)表于 05-09 14:23

    鴻蒙Flutter實(shí)戰(zhàn):07混合開(kāi)發(fā)

    # 鴻蒙Flutter實(shí)戰(zhàn):混合開(kāi)發(fā) 鴻蒙Flutter混合開(kāi)發(fā)主要有兩種形式。 ## 1.基于har 將flutter module
    發(fā)表于 10-23 16:00

    鴻蒙Flutter實(shí)戰(zhàn):08-如何調(diào)試代碼

    # 鴻蒙Flutter實(shí)戰(zhàn):如何調(diào)試代碼 ## 1.環(huán)境搭建 參考文章[鴻蒙Flutter實(shí)戰(zhàn):01-搭建開(kāi)發(fā)環(huán)境](https://g
    發(fā)表于 10-23 16:29

    鴻蒙Flutter實(shí)戰(zhàn):11-使用 Flutter SDK 3.22.0

    # 使用 Flutter SDK 3.22.0 ## SDK 安裝 參考[鴻蒙Flutter實(shí)戰(zhàn):01-搭建開(kāi)發(fā)環(huán)境]文章的說(shuō)明,首先安裝 Flutter SDK 3.22.0。 目前
    發(fā)表于 11-01 15:03

    鴻蒙Flutter實(shí)戰(zhàn):14-現(xiàn)有Flutter 項(xiàng)目支持鴻蒙 II

    分別安裝官方的3.22版本,以及鴻蒙社區(qū)的 3.22.0 版本 3.搭建 Flutter鴻蒙開(kāi)發(fā)環(huán)境 參考文章《鴻蒙Flutter實(shí)戰(zhàn):0
    發(fā)表于 12-26 14:59

    鴻蒙 OS 應(yīng)用開(kāi)發(fā)初體驗(yàn)

    Package 的縮寫(xiě))。是鴻蒙操作系統(tǒng)設(shè)計(jì)的應(yīng)用程序包格式。 .hap 文件包含了應(yīng)用程序的代碼、資源和元數(shù)據(jù)等信息,用于在 HarmonyOS 設(shè)備上安裝和運(yùn)行應(yīng)用程序。 整體開(kāi)發(fā)流程跟
    發(fā)表于 11-02 19:38

    如何使用 HiBurn 工具燒錄鴻蒙的 .bin 文件到 Hi3861 開(kāi)發(fā)

    鴻蒙官方文檔的Hi3861開(kāi)發(fā)板第一個(gè)示例程序中描述了如何使用 DevEco Device Tool 工具燒錄二進(jìn)制文件到 Hi3861 開(kāi)發(fā)板。本文將介紹如何使用 HiBurn 工具
    的頭像 發(fā)表于 10-25 09:23 ?5071次閱讀

    華為開(kāi)發(fā)者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)

    HDC 2021華為開(kāi)發(fā)者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)
    的頭像 發(fā)表于 10-23 16:40 ?2081次閱讀
    華為<b class='flag-5'>開(kāi)發(fā)</b>者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>鴻蒙</b>智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)

    自制一款鴻蒙應(yīng)用文件管理

    在涉及應(yīng)用內(nèi)部存儲(chǔ)的開(kāi)發(fā)時(shí),常常翻閱手機(jī)自帶的文件管理檢查。正好在學(xué)習(xí)文件管理的接口,想著實(shí)現(xiàn)一個(gè)第三方組件用于當(dāng)前應(yīng)用的
    的頭像 發(fā)表于 03-08 14:22 ?2361次閱讀

    鴻蒙APP開(kāi)發(fā)實(shí)戰(zhàn):【Api9】拍照、拍視頻;選擇圖片、視頻、文件工具類(lèi)

    鴻蒙開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)進(jìn)行系統(tǒng)調(diào)用,拍照、拍視頻、選擇圖庫(kù)圖片、選擇圖庫(kù)視頻、選擇文件。今天就給大家分享一個(gè)工具類(lèi)。
    的頭像 發(fā)表于 03-26 16:27 ?1254次閱讀
    <b class='flag-5'>鴻蒙</b>APP<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【Api9】拍照、拍視頻;選擇圖片、視頻、<b class='flag-5'>文件</b>工具類(lèi)

    OpenHarmony開(kāi)發(fā)實(shí)例:【鴻蒙.bin文件燒錄】

    如何使用HiBurn工具燒錄鴻蒙的.bin文件到Hi3861開(kāi)發(fā)板。
    的頭像 發(fā)表于 04-14 09:54 ?752次閱讀
    OpenHarmony<b class='flag-5'>開(kāi)發(fā)</b>實(shí)例:【<b class='flag-5'>鴻蒙</b>.bin<b class='flag-5'>文件</b>燒錄】

    鴻蒙開(kāi)發(fā)文件管理:【@ohos.fileio (文件管理)】

    該模塊提供文件存儲(chǔ)管理能力,包括文件基本管理、文件目錄管理
    的頭像 發(fā)表于 06-12 18:12 ?1935次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開(kāi)發(fā)文件</b><b class='flag-5'>管理</b>:【@ohos.fileio (<b class='flag-5'>文件</b><b class='flag-5'>管理</b>)】

    鴻蒙開(kāi)發(fā)文件管理:【@ohos.fileManager (公共文件訪(fǎng)問(wèn)與管理)】

    該模塊提供公共文件訪(fǎng)問(wèn)和管理的服務(wù)接口,向下對(duì)接底層文件管理服務(wù),如媒體庫(kù)、外卡管理;向上對(duì)應(yīng)用程序提供公共
    的頭像 發(fā)表于 06-12 17:00 ?1596次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開(kāi)發(fā)文件</b><b class='flag-5'>管理</b>:【@ohos.fileManager (公共<b class='flag-5'>文件</b>訪(fǎng)問(wèn)與<b class='flag-5'>管理</b>)】

    鴻蒙5開(kāi)發(fā)寶藏案例分享---一多開(kāi)發(fā)實(shí)例(音樂(lè))

    各位開(kāi)發(fā)者小伙伴們好呀!今天咱們來(lái)點(diǎn)硬核干貨!最近在鴻蒙文檔中心挖到一座“金礦”——官方竟然暗藏了100+實(shí)戰(zhàn)案例,從分布式架構(gòu)到交互動(dòng)效優(yōu)化應(yīng)有盡有!這些案例不僅藏著華為工程師的私房技巧,還直接
    的頭像 發(fā)表于 06-30 11:54 ?345次閱讀