HarmonyOS 鸿蒙Next 缓存文件至公共目录

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 缓存文件至公共目录

有大佬清楚缓存文件如何至公共目录吗?

2 回复
import { BusinessError, request } from '@kit.BasicServicesKit';
import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import { fileIo, fileUri } from '@kit.CoreFileKit';

@Entry
@Component
struct FileCover {
  build() {
    RelativeContainer() {
      Column({ space: 5 }) {
        Button('保存').onClick(() => {
          const context = getContext(this);
          const downloadUrl = 'https://www.icbccs.com.cn/upload/829/File/201905/zhixiaodianzixieyi.pdf';
          let dirPath = context.filesDir
          let fileName = 'b.pdf'
          //防止沙箱重名导致下载失败
          if (fileIo.accessSync(`${dirPath}/${fileName}`)) {
            fileIo.rmdirSync(`${dirPath}/${fileName}`)
          }
          try {
            request.downloadFile(context, {
              enableMetered: true,
              url: downloadUrl,
              filePath: `${dirPath}/${fileName}`
            }).then((downloadTask: request.DownloadTask) => {
              downloadTask.on('fail', (err: number) => {
                console.error(`Failed to download the task. Code: ${err}`);
              });
              downloadTask.on('progress', (receivedSize: number, totalSize: number) => {
                console.log('download', "receivedSize:" + (receivedSize / 1024) + " totalSize:" + (totalSize / 1024));
              });
              downloadTask.on('complete', () => {
                //将文件复制到文件夹中
                const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例
                documentSaveOptions.newFileNames = ["b.pdf"]; // 保存文件名(可选)
                const documentViewPicker = new picker.DocumentViewPicker;
                documentViewPicker.save(documentSaveOptions)
                  .then(async (documentSaveResult) => {
                    // 获取到到图片或者视频文件的URI后进行文件读取等操作
                    let uri = documentSaveResult[0];
                    console.info('pub uri:' + uri)
                    console.log('保存=======' + context.filesDir)
                    // 沙箱路径文件
                    let sanFile = fs.openSync(context.filesDir + '/b.pdf', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
                    let pubFile = fs.openSync(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
                    // 将文件从沙箱路拷贝到公共路径
                    fs.copyFileSync(sanFile.fd, pubFile.fd)
                    console.log("-------")
                  })
                console.log('下载完成')
              })
            }
              // 下载完成
            )
              .catch((err: BusinessError) => {
                console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
              });
          } catch (error) {
            let err: BusinessError = error as BusinessError;
            console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
          }
        })
      }
      .alignRules({
        center: { anchor: '__container__', align: VerticalAlign.Center },
        middle: { anchor: '__container__', align: HorizontalAlign.Center }
      })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 缓存文件至公共目录的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS 鸿蒙Next系统中,缓存文件至公共目录的操作主要涉及到文件系统API和权限管理。以下步骤简述了如何实现这一过程:

  1. 权限声明:首先,在应用的config.json文件中声明对外部存储的访问权限,确保应用有权写入公共目录。

  2. 获取公共目录路径:使用HarmonyOS提供的文件系统API,通过FilePickerMediaStore等接口获取公共目录的路径。例如,可以通过MediaStore.Audio.Media.EXTERNAL_CONTENT_URI等URI访问特定类型的公共目录。

  3. 创建并写入缓存文件:在获取到公共目录路径后,使用文件I/O操作(如FileOutputStream等,但注意这里不直接涉及Java或C语言的具体实现)在指定路径下创建文件,并将缓存数据写入该文件。

  4. 处理权限变化:注意处理用户可能随时撤销存储权限的情况,确保应用在权限变化时能够妥善处理。

  5. 错误处理:对于文件操作中的异常,如路径不存在、权限不足等,需要进行适当的错误处理。

完成以上步骤后,应用应能将缓存文件成功保存至公共目录。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部