鸿蒙开发进阶(HarmonyOS )通过 ArkTS 接口获取并访问公共目录 ...

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

 鸿蒙NEXT开发实战往期必看文章:
一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发
“非常详细的” 鸿蒙HarmonyOS Next应用开发学习门路!(从零基础入门到精通)
HarmonyOS NEXT应用开发案例实践总结合(一连更新......)
HarmonyOS NEXT应用开发性能优化实践总结(一连更新......)

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

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


  • 使用此方式,需确认装备具有以下体系能力:SystemCapability.FileManagement.File.Environment.FolderObtain,当前仅支持2in1装备。
    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.    ]
复制代码
示例


  • 获取公共目录路径。
    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.      } catch (error) {
    10.          const err: BusinessError = error as BusinessError;
    11.          console.error(`failed to get user dir, because: ${JSON.stringify(err)}`);
    12.      }
    13. }
    复制代码
  • 以 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. }
    复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表