HarmonyOS Next开发学习手册——获取并使用公共目录

十念  金牌会员 | 2024-9-13 14:57:50 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 828|帖子 828|积分 2484

通过 ArkTS 接口获取并访问公共目录

目录环境能力接口(ohos.file.environment)提供获取公共目录路径的能力,支持三方应用在公共文件用户目录下进行文件访问操作。
约束限制


  • 使用此方式,需确认设备具有以下系统能力:SystemCapability.FileManagement.File.Environment.FolderObtain。
  1. if (!canIUse('SystemCapability.FileManagement.File.Environment.FolderObtain')) {
  2.     console.error('this api is not supported on this device');
  3.     return;
  4. }
复制代码


  • 公共目录获取接口仅用于获取公共目录路径,不对公共目录访问权限进行校验。若需访问公共目录需申请对应的公共目录访问权限。三方应用必要访问公共目录时,需通过弹窗授权向用户申请授予 Download 目录权限、Documents 目录权限或 Desktop 目录权限,具体参考 访问控制-向用户申请授权。
  1. "requestPermissions" : [
  2.     "ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY",
  3.     "ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY",
  4.     "ohos.permission.READ_WRITE_DESKTOP_DIRECTORY",
  5. ]
复制代码
示例

  • 获取公共目录路径。
  1. import { BusinessError } from '@kit.BasicServicesKit';
  2. import { Environment } from '@kit.CoreFileKit';
  3. function getUserDirExample() {
  4.      try {
  5.          const downloadPath = Environment.getUserDownloadDir();
  6.          console.info(`success to getUserDownloadDir: ${downloadPath}`);
  7.          const documentsPath = Environment.getUserDocumentDir();
  8.          console.info(`success to getUserDocumentDir: ${documentsPath}`);
  9.          const desktopPath = Environment.getUserDesktopDir();
  10.          console.info(`success to getUserDesktopDir: ${desktopPath}`);
  11.      } catch (error) {
  12.          const err: BusinessError = error as BusinessError;
  13.          console.error(`failed to get user dir, because: ${JSON.stringify(err)}`);
  14.      }
  15. }
复制代码

  • 以 Download 目录为例,访问 Download 目录下的文件。
  1. import { BusinessError } from '@kit.BasicServicesKit';
  2. import { Environment } from '@kit.CoreFileKit';
  3. import { fileIo as fs } from '@kit.CoreFileKit';
  4. import { common } from '@kit.AbilityKit';
  5. function readUserDownloadDirExample() {
  6.      // 检查是否具有 READ_WRITE_DOWNLOAD_DIRECTORY 权限,无权限则需要向用户申请授予权限。
  7.      try {
  8.          // 获取 Download 目录
  9.          const downloadPath = Environment.getUserDownloadDir();
  10.          console.info(`success to getUserDownloadDir: ${downloadPath}`);
  11.          const context = getContext() as common.UIAbilityContext;
  12.          const dirPath = context.filesDir;
  13.          console.info(`success to get filesDir: ${dirPath}`);
  14.          // 查看 Download 目录下的文件并拷贝到沙箱目录中
  15.          let fileList: string[] = fs.listFileSync(downloadPath);
  16.          fileList.forEach((file, index) => {
  17.              console.info(`${downloadPath} ${index}: ${file}`);
  18.              fs.copyFileSync(`${downloadPath}/${file}`, `${dirPath}/${file}`);
  19.          });
  20.          // 查看沙箱目录下对应的文件
  21.          fileList = fs.listFileSync(dirPath);
  22.          fileList.forEach((file, index) => {
  23.              console.info(`${dirPath} ${index}: ${file}`);
  24.          });
  25.      } catch (error) {
  26.          const err: BusinessError = error as BusinessError;
  27.          console.error(`Error code: ${err.code}, message: ${err.message}`);
  28.      }
  29. }
复制代码

  • 以 Download 目录为例,保存文件到 Download 目录。
  1. import { BusinessError } from '@kit.BasicServicesKit';
  2. import { Environment } from '@kit.CoreFileKit';
  3. import { fileIo as fs } from '@kit.CoreFileKit';
  4. function writeUserDownloadDirExample() {
  5. // 检查是否具有 READ_WRITE_DOWNLOAD_DIRECTORY 权限,无权限则需要向用户申请授予权限。
  6.      try {
  7.          // 获取 Download 目录
  8.          const downloadPath = Environment.getUserDownloadDir();
  9.          console.info(`success to getUserDownloadDir: ${downloadPath}`);
  10.          // 保存 temp.txt 到 Download 目录下
  11.          const file = fs.openSync(`${downloadPath}/temp.txt`, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
  12.          fs.writeSync(file.fd, 'write a message');
  13.          fs.closeSync(file);
  14.      } catch (error) {
  15.          const err: BusinessError = error as BusinessError;
  16.          console.error(`Error code: ${err.code}, message: ${err.message}`);
  17.      }
  18. }
复制代码
通过 C/C++ 接口获取并使用公共目录

除了通过 ArkTS 访问公共目录的方式,也可通过 C/C++ 接口进行目录访问,具体可以参考 Environment。
约束限制


  • 使用此接口,需确认设备具有以下系统能力:SystemCapability.FileManagement.File.Environment.FolderObtain。
  • 三方应用必要访问公共目录时,需通过弹窗授权向用户申请授予 Download 目录权限、Documents 目录权限或 Desktop 目录权限,具体参考访问控制-向用户申请授权。
接口说明

接口的具体说明,请参考API参考
接口名称描述FileManagement_ErrCode OH_Environment_GetUserDownloadDir (char **result)获取用户Download目录沙箱路径。只支持2in1设备FileManagement_ErrCode OH_Environment_GetUserDesktopDir (char **result)获取用户Desktop目录沙箱路径。只支持2in1设备FileManagement_ErrCode OH_Environment_GetUserDocumentDir (char **result)获取用户Document目录沙箱路径。只支持2in1设备 开发步骤

在CMake脚本中链接动态库
CMakeLists.txt中添加以下lib。
  1. target_link_libraries(sample PUBLIC libohenvironment.so libhilog_ndk.z.so)
复制代码
添加头文件
  1. #include <filemanagement/environment/oh_environment.h>
  2. #include <filemanagement/fileio/oh_fileio.h>
  3. #include <hilog/log.h>
复制代码

  • 调用 OH_Environment_GetUserDownloadDir 接口获取用户 Download 目录沙箱路径,在接口中使用malloc申请的内存必要在使用完后开释因此必要free对应的内存。示例代码如下所示:
  1. void GetUserDownloadDirExample()
  2. {
  3.     char *downloadPath = nullptr;
  4.     FileManagement_ErrCode ret = OH_Environment_GetUserDownloadDir(&downloadPath);
  5.     if (ret == 0) {
  6.         OH_LOG_INFO(LOG_APP, "Download Path=%{public}s", downloadPath);
  7.         free(downloadPath);
  8.     } else {
  9.         OH_LOG_ERROR(LOG_APP, "GetDownloadPath fail, error code is %{public}d", ret);
  10.     }
  11. }
复制代码

  • 调用 OH_Environment_GetUserDownloadDir 接口获取用户 Download 目录沙箱路径,并查看 Download 目录下的文件。示例代码如下所示:
  1. void ScanUserDownloadDirPathExample()
  2. {
  3.     // 获取 download 路径
  4.     char *downloadPath = nullptr;
  5.     FileManagement_ErrCode ret = OH_Environment_GetUserDownloadDir(&downloadPath);
  6.     if (ret == 0) {
  7.         OH_LOG_INFO(LOG_APP, "Download Path=%{public}s", downloadPath);
  8.     } else {
  9.         OH_LOG_ERROR(LOG_APP, "GetDownloadPath fail, error code is %{public}d", ret);
  10.         return;
  11.     }
  12.     // 查看文件夹下的文件
  13.     struct dirent **namelist = {nullptr};
  14.     int num = scandir(downloadPath, &namelist, nullptr, nullptr);
  15.     if (num < 0) {
  16.         free(downloadPath);
  17.         OH_LOG_ERROR(LOG_APP, "Failed to scan dir");
  18.         return;
  19.     }
  20.     for (int i = 0; i < num; i++) {
  21.         OH_LOG_INFO(LOG_APP, "%{public}s", namelist[i]->d_name);
  22.     }
  23.     free(downloadPath);
  24.     free(namelist);
  25. }
复制代码

  • 调用 OH_Environment_GetUserDownloadDir 接口获取用户 Download 目录沙箱路径,并保存 temp.txt 到 Download 目录下。示例代码如下所示:
  1. void WriteUserDownloadDirPathExample()
  2. {
  3.     // 获取 download 路径
  4.     char *downloadPath = nullptr;
  5.     FileManagement_ErrCode ret = OH_Environment_GetUserDownloadDir(&downloadPath);
  6.     if (ret == 0) {
  7.         OH_LOG_INFO(LOG_APP, "Download Path=%{public}s", downloadPath);
  8.     } else {
  9.         OH_LOG_ERROR(LOG_APP, "GetDownloadPath fail, error code is %{public}d", ret);
  10.         return;
  11.     }
  12.     // 保存文件到 download 目录下
  13.     std::string filePath = std::string(downloadPath) + "/temp.txt";
  14.     free(downloadPath);
  15.     std::ofstream outfile;
  16.     outfile.open(filePath.c_str());
  17.     if (!outfile) {
  18.         OH_LOG_ERROR(LOG_APP, "Failed to open file");
  19.         return;
  20.     }
  21.     std::string msg = "Write a message";
  22.     outfile.write(msg.c_str(), sizeof(msg));
  23.     outfile.close();
  24. }
复制代码
鸿蒙全栈开发全新学习指南

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道必要重点把握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。以是要有一份实用的鸿蒙(HarmonyOS NEXT)学习门路与学习文档用来跟着学习好坏常有须要的。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习门路,包罗了鸿蒙开发必把握的焦点知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端摆设、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
本门路共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能


第二阶段:鸿蒙南北双向高工技能底子:gitee.com/MNxiaona/733GH


第三阶段:应用开发中高级就业技术


第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH


《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发底子知识:gitee.com/MNxiaona/733GH

1.应用底子知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共变乱与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH


鸿蒙入门讲授视频:


美团APP实战开发讲授:gitee.com/MNxiaona/733GH


写在最后



  • 如果你觉得这篇内容对你还蛮有资助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表