> 技术文档 > 鸿蒙元服务文件存储:ArkTS 实现文件创建、读写与管理 _鸿蒙 文件 存储

鸿蒙元服务文件存储:ArkTS 实现文件创建、读写与管理 _鸿蒙 文件 存储


鸿蒙元服务文件存储:ArkTS 实现文件创建、读写与管理

在鸿蒙元服务开发过程中图片、文档、音频等复杂数据的本地存储与管理需求。本文将结合 ArkTS 语言,详细介绍鸿蒙文件存储 API 的使用方法,通过代码示例展示文件创建、读取、写入、删除等核心操作,帮助开发者高效实现数据本地持久化。

一、文件存储基础概念

鸿蒙系统提供了@ohos.fileio模块用于文件操作,支持以下功能:

  1. 文件路径管理:通过系统接口获取应用私有目录、公共目录等,确保数据存储的安全性和规范性。
  2. 文件流操作:使用FileIO类进行文件的读写,支持字节流和字符流操作。
  3. 文件属性管理:获取文件大小、修改时间、权限等属性,或进行文件删除、重命名等操作。

二、获取文件存储路径

在进行文件操作前,需要先确定文件存储的路径。鸿蒙提供了多种目录类型,常用的有:

  1. 应用私有目录:仅应用自身可访问,适合存储敏感数据。
  2. 公共目录:可被其他应用访问,常用于存储共享资源(需申请权限)。

以下是获取应用私有目录和公共目录的示例代码:

import fileio from \'@ohos.fileio\';

import fs from \'@ohos.fs\';

async function getStoragePaths() {

    // 获取应用私有目录

    const privateDir = await fileio.getPrivateDir();

    console.log(\'应用私有目录:\', privateDir);

    // 获取公共目录(需申请ohos.permission.READ_EXTERNAL_STORAGE和ohos.permission.WRITE_EXTERNAL_STORAGE权限)

    try {

        const publicDir = await fs.getExternalStorageDirectory();

        console.log(\'公共目录:\', publicDir);

    } catch (error) {

        console.error(\'获取公共目录失败:\', error);

    }

}

上述代码中,fileio.getPrivateDir()用于获取应用私有目录;fs.getExternalStorageDirectory()用于获取公共目录,但需注意在config.json中配置相应权限:

{

    \"reqPermissions\": [

        {

            \"name\": \"ohos.permission.READ_EXTERNAL_STORAGE\"

        },

        {

            \"name\": \"ohos.permission.WRITE_EXTERNAL_STORAGE\"

        }

    ]

}

三、文件创建与写入

3.1 创建普通文本文件并写入内容

import fileio from \'@ohos.fileio\';

async function createAndWriteFile() {

    const privateDir = await fileio.getPrivateDir();

    const filePath = `${privateDir}/test.txt`;

    try {

        // 创建文件并写入内容

        const file = await fileio.openSync(filePath, fileio.OpenMode.CREATE | fileio.OpenMode.WRITE);

        const content = \"这是一个测试文件的内容\";

        const bytesWritten = await file.writeSync(Buffer.from(content, \'utf8\'));

        console.log(`写入成功,写入字节数: ${bytesWritten}`);

        await file.closeSync();

    } catch (error) {

        console.error(\'文件创建或写入失败:\', error);

    }

}

在这段代码中,首先获取应用私有目录,拼接文件路径test.txt。然后使用fileio.openSync以创建和写入模式打开文件,通过writeSync方法将字符串内容转换为字节流写入文件,最后关闭文件。

3.2 写入二进制文件(如图片)

假设已获取图片的二进制数据(例如通过网络请求下载图片),将其写入文件:

import fileio from \'@ohos.fileio\';

async function saveImageFile(imageData: ArrayBuffer) {

    const privateDir = await fileio.getPrivateDir();

    const filePath = `${privateDir}/example.jpg`;

    try {

        const file = await fileio.openSync(filePath, fileio.OpenMode.CREATE | fileio.OpenMode.WRITE);

        const buffer = new Uint8Array(imageData);

        const bytesWritten = await file.writeSync(buffer);

        console.log(`图片保存成功,写入字节数: ${bytesWritten}`);

        await file.closeSync();

    } catch (error) {

        console.error(\'图片保存失败:\', error);

    }

}

此代码接收图片的ArrayBuffer数据,将其转换为Uint8Array后写入文件,实现图片的本地存储。

四、文件读取

4.1 读取文本文件内容

import fileio from \'@ohos.fileio\';

async function readTextFile() {

    const privateDir = await fileio.getPrivateDir();

    const filePath = `${privateDir}/test.txt`;

    try {

        const file = await fileio.openSync(filePath, fileio.OpenMode.READ);

        const buffer = new Uint8Array(1024); // 缓冲区大小

        const bytesRead = await file.readSync(buffer);

        const content = new TextDecoder(\'utf8\').decode(buffer.subarray(0, bytesRead));

        console.log(\'文件内容:\', content);

        await file.closeSync();

    } catch (error) {

        console.error(\'文件读取失败:\', error);

    }

}

上述代码以只读模式打开文件,通过readSync方法将文件内容读取到缓冲区,再使用TextDecoder将字节流转换为字符串,获取文件内容。

4.2 读取二进制文件(如音频、图片)

import fileio from \'@ohos.fileio\';

async function readBinaryFile() {

    const privateDir = await fileio.getPrivateDir();

    const filePath = `${privateDir}/example.jpg`;

    try {

        const file = await fileio.openSync(filePath, fileio.OpenMode.READ);

        const stats = await file.statSync();

        const fileSize = stats.size;

        const buffer = new Uint8Array(fileSize);

        await file.readSync(buffer);

        console.log(\'二进制文件读取成功,文件大小:\', fileSize);

        // 可将buffer传递给其他模块进行后续处理,如显示图片

        await file.closeSync();

    } catch (error) {

        console.error(\'二进制文件读取失败:\', error);

    }

}

该示例先获取文件大小,创建对应大小的缓冲区,将二进制文件内容完整读取到缓冲区,适用于音频、图片等二进制文件的读取。

五、文件删除与属性管理

5.1 删除文件

import fileio from \'@ohos.fileio\';

async function deleteFile() {

    const privateDir = await fileio.getPrivateDir();

    const filePath = `${privateDir}/test.txt`;

    try {

        const result = await fileio.unlinkSync(filePath);

        if (result === 0) {

            console.log(\'文件删除成功\');

        } else {

            console.error(\'文件删除失败\');

        }

    } catch (error) {

        console.error(\'删除文件时出错:\', error);

    }

}

使用fileio.unlinkSync方法删除指定路径的文件,返回值为 0 表示删除成功。

5.2 获取文件属性

import fileio from \'@ohos.fileio\';

async function getFileAttributes() {

    const privateDir = await fileio.getPrivateDir();

    const filePath = `${privateDir}/test.txt`;

    try {

        const stats = await fileio.statSync(filePath);

        console.log(\'文件大小:\', stats.size);

        console.log(\'文件修改时间:\', stats.mtime);

        console.log(\'文件权限:\', stats.mode);

    } catch (error) {

        console.error(\'获取文件属性失败:\', error);

    }

}

通过fileio.statSync方法获取文件的大小、修改时间、权限等属性信息。

六、综合示例:图片文件的完整操作

下面的示例展示了从下载图片(模拟数据)、保存到本地,再到读取并显示图片的完整流程:

import fileio from \'@ohos.fileio\';

import image from \'@ohos.multimedia.image\';

// 模拟获取图片二进制数据

function generateMockImageData(): ArrayBuffer {

    // 实际开发中此处应为网络请求或其他数据来源

    const buffer = new ArrayBuffer(1024 * 1024); // 模拟1MB数据

    const uint8Array = new Uint8Array(buffer);

    // 填充数据示例

    for (let i = 0; i < uint8Array.length; i++) {

        uint8Array[i] = i % 256;

    }

    return buffer;

}

async function handleImageFile() {

    const privateDir = await fileio.getPrivateDir();

    const imageFilePath = `${privateDir}/example.jpg`;

    // 保存图片

    const imageData = generateMockImageData();

    await saveImageFile(imageData);

    // 读取图片并显示(假设在UI组件中显示)

    try {

        const file = await fileio.openSync(imageFilePath, fileio.OpenMode.READ);

        const stats = await file.statSync();

        const fileSize = stats.size;

        const buffer = new Uint8Array(fileSize);

        await file.readSync(buffer);

        await file.closeSync();

        const imageSource = await image.createImageSource({

            type: image.SourceType.BUFFER,

            data: buffer

        });

        const imageDataObj = await imageSource.createImageData();

        // 在UI中使用imageDataObj显示图片(此处省略UI代码)

    } catch (error) {

        console.error(\'读取或显示图片失败:\', error);

    }

}

此示例整合了图片存储、读取及显示的关键步骤,展示了文件存储在实际场景中的应用。

总结

通过@ohos.fileio和相关模块,鸿蒙开发者能够在 ArkTS 中高效实现文件的创建、读写、删除及属性管理。无论是文本数据还是图片、音频等复杂二进制数据,都可借助这些 API 完成本地存储与管理。在实际开发中,需注意权限申请、异常处理以及合理的文件路径规划,确保数据存储的安全性和稳定性。