介紹
本示例主要展示了文件管理相關的功能,使用[@ohos.multimedia.medialibrary]、[@ohos.filemanagement.userFileManager] 、[@ohos.fileio] 、[@ohos.file.fs]、[@ohos.app.ability.contextConstant]
等接口,實現了增添文件、刪除文件、查找指定類型文件文件、復制并移動文件、切換加密分區和預覽圖片、監聽文件的功能;
效果預覽
使用說明
- 在主界面,可以點擊圖片、視頻、文檔、音頻等按鈕進入對應目錄的文件列表瀏覽界面;
- 在文檔列表瀏覽界面,點擊“+”按鈕,可以添加文件;
- 在文檔列表瀏覽界面,長按列表項會出現刪除圖片,點擊刪除圖標可以刪除文件;
- 在圖片文件列表界面,點擊圖片可以進入圖片預覽界面。
- 進入“我的手機”頁面前應先安裝[MyPhoneFilePage],在主頁點擊“我的手機”,進入應用目錄下。
- 列表的上方是默認的EL2加密分區的應用根目錄下文件列表,點擊下方兩個按鈕“data/app/el3”和“data/app/el4”分別進入EL3和EL4加密分區應用根目錄,進入后對文件或文件夾操作與EL2加密分區相同。
- 點擊左下角“新建文件夾”按鈕,在彈窗中輸入文件夾名稱,點擊彈窗中的“確定”按鈕,完成創建。
- 點擊新建的文件夾,進入目錄,在新目錄中點擊左下角的“新建文件”,在彈窗的窗口中填寫文件名稱,然后點擊確定,完成創建。
- 點擊右上角多選按鈕,選擇需要重命名的文件(僅選中一個文件時可用),點擊重命名,在彈窗中修改文件名稱,點擊“確定”,完成修改。
- 點擊右上角多選按鈕,選擇需要復制和移動的文件(可多選,并且不可移動到本身的子目錄下),選中后點擊左下角“復制和移動”按鈕,在頁面中點擊目標目錄會進入該目錄,在目標目錄下點擊“移動到這”按鈕,完成文件復制和移動。
- 點擊右上角多選按鈕,選擇需要刪除的文件,選中后點擊右下角“更多”按鈕,彈出的菜單中選擇“刪除”,在彈窗中點擊“刪除”,即可刪除文件。
- 點擊右上角多選按鈕,選擇一項需要修改時間的文件,選中后點擊右下角“更多”按鈕,彈出的菜單中選擇“修改文件(夾)時間”,在彈窗的文本框中輸入要修改的時間,點擊“確定”,即可修改文件(夾)時間。
- 點擊單個文件,可進入文件內容頁面,點擊右上角編輯按鈕,進入編輯模式編輯、修改文件內容,然后點擊右上角的保存按鈕保存對文件的修改,點擊左上角"X"按鈕退出編輯模式,點擊返回按鈕返回上一頁。
- 在主頁點擊“監聽文件”,進入文件監聽頁面。
- 點擊添加監聽按鈕,選擇IN_CREATE監聽,然后點擊確定按鈕,成功添加IN_CREATE監聽。
- 點擊添加按鈕,成功添加一個文件,觸發事件后日志顯示為相應日志:event:256,fileName為新增文件的路徑。
- 點擊停止監聽按鈕,選擇IN_CREATE監聽,然后點擊確定按鈕,成功停止IN_CREATE監聽。
- 點擊添加按鈕,成功添加一個文件,觸發事件后日志無變化。
- 點擊添加監聽按鈕,選擇IN_DELETE監聽,然后點擊確定按鈕,成功添加IN_DELETE監聽。
- 選擇要刪除的文件item,左滑后點擊刪除圖標,成功刪除一個文件,觸發事件后日志顯示為相應日志:event:512,fileName為刪除文件的路徑。
- 點擊停止監聽按鈕,選擇IN_DELETE監聽,然后點擊確定按鈕,成功停止IN_CREATE監聽。
- 選擇要刪除的文件item,左滑后點擊刪除圖標,成功刪除一個文件,觸發事件后日志無變化。
- 點擊添加監聽按鈕,選擇IN_MODIFY監聽,然后點擊確定按鈕,成功添加IN_MODIFY監聽。
- 選擇要編輯的文件item,左滑后點擊編輯圖標,進入文件編輯界面,修改文件名和文件內容,修改之后點擊保存圖標,頁面顯示的文件文件大小發生變化,然后點擊返回圖標后返回文件監聽界面,查看觸發事件后日志顯示為相應日志:event:2,fileName為修改后文件的路徑。IN_MODIFY監聽只監聽文件內容是否發生變化,若單獨修改文件名,則不會更新監聽日志。
- 點擊停止監聽按鈕,選擇IN_MODIFY監聽,然后點擊確定按鈕,成功停止IN_MODIFY監聽。
- 選擇要編輯的文件item,左滑后點擊編輯圖標,進入文件編輯界面,修改文件名和文件內容,修改之后點擊保存圖標,頁面顯示的文件文件大小發生變化,然后點擊返回圖標后返回文件監聽界面,查看觸發事件后日志無變化。
具體實現:
- 增添文件、刪除文件、查找指定類型文件文件和預覽圖片的功能接口封裝在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庫相關的接口
*/
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')
// 異常情況下統一返回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來獲取MediaLibrary對象;
- 讀取每個文件的數據:使用MediaLibrary.getFileAssets讀取滿足條件的文件集合FetchFileResult,然后調用FetchFileResult.getFirstObject();
- 創建模擬文件:使用MediaLibrary.getPublicDirectory()獲取系統預定的目錄,然后使用MediaLibrary.createAsset();
- 刪除指定路徑的文件:使用MediaLibrary.deleteAsset();
- 獲取預覽圖:使用image.createImageSource()創建指定的文件資源ImageSource,然后調用ImageSource.createPixelMap(),接口參考:[@ohos.multimedia.image] 。
- MyPhone模塊中的文件增刪、復制移動、查找功能封裝在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}`);
}
}
/*
// 總空間---默認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}`;
}
}
*/
// 根據沙箱路徑打開目錄
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}`);
}
// 讀取的結果
let dirent: fileio.Dirent;
// 結果數組
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();
// 如果是文件夾,就讀取文件夾中文件的數量
if (dirent.isDirectory()) {
subdirectoryNum = this.getSubdirectoryNum(filePath + `${dirent.name}`);
time = this.getFileTime(filePath + `${dirent.name}`);
} else {
// 如果不是文件夾,就讀取文件大小和時間
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;
}
// 獲取目錄中的子目錄個數
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}`);
}
// 讀取的結果
let dirent: fileio.Dirent;
// 記錄子目錄的個數
let subdirectoryNum = 0;
do {
dirent = dir.readSync();
if (dirent) {
subdirectoryNum++;
}
} while (dirent);
return subdirectoryNum;
}
// 獲取文件修改時間
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}`);
}
}
// 創建目錄
createDirectory(filePath: string): void {
try {
fileio.mkdirSync(filePath);
} catch (err) {
Logger.error(TAG, `create directory failed, code is ${err.code}, message is ${err.message}`);
}
}
// 創建文件
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}`);
}
}
// 刪除目錄和文件---選中項
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}`);
}
}
// 復制文件
copyFile(filePath: string, newFilePath: string): void {
try {
// 遍歷數據直接copy所有項目
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}`);
}
}
// 開始移動文件
startMoveFile(needMoveFiles: Array< FileType >, newFilePath: string): void {
// 遍歷數據
needMoveFiles.forEach((file: FileType): void = > {
// 如果是目錄
if (file.type === 1) {
// 先創建這個目錄
this.createDirectory(`${newFilePath}/${file.fileName}`);
// 獲取當前文件夾下的所有文件目錄
let subdirectory = this.getSubdirectory(`${file.filePath}/`);
// 處理為我們想要的格式
let needMoveFiles: Array< FileType > = [];
// 遍歷子目錄數據
subdirectory.forEach((subdirectoryData: SubDirectoryType) = > {
let data: FileType = {
filePath: `${file.filePath}/${subdirectoryData.name}`,
fileName: subdirectoryData.name,
type: subdirectoryData.type
};
// 逐一添加進去
needMoveFiles.push(data);
})
// 使用我們的數據遞歸
this.startMoveFile(needMoveFiles, `${newFilePath}/${file.fileName}`);
} else {
this.copyFile(file.filePath, `${newFilePath}/${file.fileName}`);
}
})
}
}
export default new FileSystem();
- 讀取文件列表:使用fileio.opendirSync()打開指定目錄dir,然后使用dir.readSync()讀取文件內容dirent,在調用dirent中相關api獲取想要的文件參數;
- 創建目錄:使用fileio.mkdirSync()創建文件夾;
- 創建文件:使用fileio.openSync()創建文件;
- 刪除選中內容:使用fileio.rmdirSync()刪除文件夾,使用fileio.unlinkSync()刪除文件;
- 復制文件:使用fileio.copyFileSync()復制目標文件;
- 移動文件:使用fileio.mkdirSync()創建指定目錄,再遞歸選中目錄中的文件,將內部的文件創建到指定的位置。
- 修改加密分區:修改應用上下文Context的area,實現當前加密分區的修改。
- 在Library模塊中通過封裝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'
/**
* 文件管理接口,統一封裝了各模塊對外提供的功能接口
*/
class FileManager {
/**
* 申請文件管理權限
* @param context 上下文對象
*/
requestPermission(context): void {
MediaLibraryManager.requestPermission(context)
}
/**
* 通過傳入文件對象FileAsset,獲取到文件中的圖片PixelMap對象
* @param fileAsset 文件對象
* @return Promise< image.PixelMap > 返回PixelMap對象
*/
async getPixelMapByFileAsset(fileAsset: mediaLibrary.FileAsset): Promise< image.PixelMap > {
return await MediaLibraryManager.getPixelMapByFileAsset(fileAsset)
}
/**
* 通過傳入文件類型,獲取到不同的文件列表信息
* @param context 上下文對象
* @param fileType 文件類型
* @return Promise< mediaLibrary.FetchFileResult > 返回文件列表信息
*/
async getFileAssets(context, fileType: mediaLibrary.MediaType): Promise< mediaLibrary.FetchFileResult > {
return await MediaLibraryManager.getFileAssets(context, fileType)
}
/**
* 通過文件名稱獲取文件對象
* @param context 上下文對象
* @param name 文件名稱
* @return Promise< mediaLibrary.FileAsset > 返回文件對象信息
*/
async getFileAssetsByName(context, name: string): Promise< mediaLibrary.FileAsset > {
return await MediaLibraryManager.getFileAssetsByName(context, name)
}
/**
* 獲取文件縮略圖
* @param fileAsset 文件對象
* @return Promise< image.PixelMap > 返回縮略圖信息
*/
async getThumbnail(fileAsset: mediaLibrary.FileAsset): Promise< image.PixelMap > {
return await MediaLibraryManager.getThumbnail(fileAsset)
}
/**
* 創建文件
* @param context 上下文對象
* @param mediaType 文件類型
* @param dir 文件路徑
* @param fileName 文件名稱
* @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 文件對象
*/
async deleteFileAsset(fileAsset: mediaLibrary.FileAsset): Promise< void > {
await MediaLibraryManager.deleteFileAsset(fileAsset);
}
/**
* 創建模擬文件
* @param context 上下文對象
* @param mediaType 文件類型
* @return Promise< mediaLibrary.FileAsset > 返回文件對象
*/
async createTxtFileAsset(context): Promise< mediaLibrary.FileAsset > {
return await LocalMockData.createFileAsset(context)
}
/**
* 該文件是否支持預覽
* @param fileName 文件名
* @return boolean ture表示支持,false表示不支持
*/
isSupportPreview(fileName: string): boolean {
return LocalMockData.isSupportPreview(fileName)
}
}
export default new FileManager()
- 如效果預覽中的 圖片列表 ,讀取指定類型的文件:在[FileList.ets]中調用FileManager.getFileAssets();
- 創建模擬文件:在[FileList.ets] 中調用FileManager.createTxtFileAsset();
- 刪除指定路徑的文件:在[FileList.ets] 中調用FileManager.deleteFileAsset();
- 獲取縮略圖:在[ThumbnailImage.ets] 中調用FileManager.getThumbnail();
- 如效果預覽中的 圖片預覽 ,獲取預覽圖:在[ImagePreview.ets] 中調用FileManager.getPixelMapByFileAsset()。
- 監聽文件模塊中的文件增刪、查找、修改、監聽功能封裝在MyWatcher。
- 增加文件、刪除文件、監聽文件、停止監聽文件:在[WatcherFile.ets] 中調用MyWathcer.addFileToWatcher()、MyWathcer.deleteFileToWatcher()、MyWathcer.startWatcher(watcherName)、MyWathcer.stopWatcher();
- 修改文件:在[EditFile.ets]
中調用MyWatcher.modifyFileToWatcher()。
鴻蒙Next技術知識已更新[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]請前往參考。
約束與限制
- 本示例僅支持標準系統上運行,支持設備:RK3568;
- 本示例為Stage模型,僅支持API11版本SDK,SDK版本號(API Version 11 Beta),鏡像版本號(4.1Beta)。
- 本示例需要使用DevEco Studio 版本號(4.0Release)及以上版本才可編譯運行。
- 本示例涉及調用系統權限的接口,需要配置允許權限列表,在配置文件中的“allowed-acls”字段中增加"ohos.permission.READ_MEDIA", "ohos.permission.WRITE_MEDIA", "ohos.permission.FILE_ACCESS_MANAGER", "ohos.permission.STORAGE_MANAGER"四個權限。
審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
接口
+關注
關注
33文章
8497瀏覽量
150834 -
鴻蒙
+關注
關注
57文章
2310瀏覽量
42742
發布評論請先 登錄
相關推薦
鴻蒙實戰項目開發:【短信服務】
數據管理
電話服務
分布式應用開發
通知與窗口管理
多媒體技術
安全技能
任務管理
WebGL
國際化開發
應用測試
DFX面向未來設計
發表于 03-03 21:29
鴻蒙實戰開發-本地部署、SmartPerf 編譯部署指導文檔
你們的 『點贊和評論』,才是我創造的動力。
關注小編,同時可以期待后續文章ing?,不定期分享原創知識。
更多鴻蒙最新技術知識點,請關注作者博客:鴻蒙實戰經驗分享:鴻蒙基礎入門
發表于 05-09 14:23
鴻蒙Flutter實戰:07混合開發
# 鴻蒙Flutter實戰:混合開發
鴻蒙Flutter混合開發主要有兩種形式。
## 1.基于har
將flutter module
發表于 10-23 16:00
鴻蒙Flutter實戰:08-如何調試代碼
# 鴻蒙Flutter實戰:如何調試代碼
## 1.環境搭建
參考文章[鴻蒙Flutter實戰:01-搭建開發環境](https://g
發表于 10-23 16:29
鴻蒙Flutter實戰:11-使用 Flutter SDK 3.22.0
# 使用 Flutter SDK 3.22.0
## SDK 安裝
參考[鴻蒙Flutter實戰:01-搭建開發環境]文章的說明,首先安裝 Flutter SDK 3.22.0。
目前鴻
發表于 11-01 15:03
鴻蒙 OS 應用開發初體驗
Package 的縮寫)。是鴻蒙操作系統設計的應用程序包格式。
.hap 文件包含了應用程序的代碼、資源和元數據等信息,用于在 HarmonyOS 設備上安裝和運行應用程序。
整體開發流程跟
發表于 11-02 19:38
如何使用 HiBurn 工具燒錄鴻蒙的 .bin 文件到 Hi3861 開發板
鴻蒙官方文檔的Hi3861開發板第一個示例程序中描述了如何使用 DevEco Device Tool 工具燒錄二進制文件到 Hi3861 開發板。本文將介紹如何使用 HiBurn 工具
自制一款鴻蒙應用文件管理器
在涉及應用內部存儲的開發時,常常翻閱手機自帶的文件管理檢查。正好在學習文件管理的接口,想著實現一個第三方組件用于當前應用的
鴻蒙開發實戰【通話管理】
通話管理模塊主要管理CS(Circuit Switch,電路交換)、IMS(IP Multimedia Subsystem,IP多媒體子系統)和OTT(over the top,OTT解決方案)三種類型的通話,負責申請通話所需要的音視頻資源,并處理多路通話時產生的各種沖突
評論