HarmonyOS鸿蒙Next中获取用户手机download目录下文件

HarmonyOS鸿蒙Next中获取用户手机download目录下文件 想要获取手机公用目录download下的文件,有什么方式吗?

看了文档,有个

ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY

允许应用访问公共目录下Download目录及子目录。

支持设备:PC/2in1 | Tablet

支持设备里面没有手机,那手机上是没有其它办法获取了吗

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-for-all-user#ohospermissionread_write_download_directory


更多关于HarmonyOS鸿蒙Next中获取用户手机download目录下文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

1、访问Download目录下的自己包名下的文件或文件夹

示例代码_使用DOWNLOAD模式保存文件后进行访问:

import { fileIo as fs, fileUri, ListFileOptions } from '@kit.CoreFileKit';
import { bundleManager } from '@kit.AbilityKit';

@Entry
@Component
struct VisitDownloadDir {
  build() {
    Column({ space: 5 }) {
      Button('DOWNLOAD模式访问')
        .onClick(() => {
          // 获取bundleName
          let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
          bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;
          let data = bundleManager.getBundleInfoForSelfSync(bundleFlags);
          console.info('getBundleInfoForSelfSync successfully: ', JSON.stringify(data));
          let bundleName = data.name;
          // 获取Download目录下应用包名对应的path
          let uri = 'file://docs/storage/Users/currentUser/Download/' + bundleName;
          let fileUriObject = new fileUri.FileUri(uri);
          let path = fileUriObject.path;
          // 递归遍历出目录下的文件,进行业务操作(保证目录下有文件)
          let listFileOption: ListFileOptions = {
            recursion: true,
          };
          let filenames = fs.listFileSync(path, listFileOption);
          for (let i = 0; i < filenames.length; i++) {
            let file: fs.File | null = null;
            try {
              file = fs.openSync(path + '/' + filenames[i], fs.OpenMode.READ_WRITE);
              console.info('file path is :', file.path);
            } catch (e) {
              console.error('fs.openSync failed error is : ', JSON.stringify(e));
            } finally {
              if (file !== null) {
                fs.closeSync(file);
              }
            }
          }
        })
    }
    .height('100%')
    .width('100%')
  }
}

2、通过 ArkTS 接口获取并访问公共目录【设备目录包含的所有】

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

    约束限制:

    • 使用此方式,需确认设备具有以下系统能力:SystemCapability.FileManagement.File.Environment.FolderObtain,当前仅支持2in1设备。

    权限申请:

    "requestPermissions" : [
        "ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY",
        "ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY",
    ]
    

示例代码_访问 Download 目录下的文件:

import { BusinessError } from '@kit.BasicServicesKit';
import { Environment } from '@kit.CoreFileKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

// 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;

function readUserDownloadDirExample(context: common.UIAbilityContext) {
    // 检查是否具有 READ_WRITE_DOWNLOAD_DIRECTORY 权限,无权限则需要向用户申请授予权限。
    try {
        // 获取 Download 目录
        const downloadPath = Environment.getUserDownloadDir();
        console.info(`success to getUserDownloadDir: ${downloadPath}`);
        const dirPath = context.filesDir;
        console.info(`success to get filesDir: ${dirPath}`);
        // 查看 Download 目录下的文件并拷贝到沙箱目录中
        let fileList: string[] = fs.listFileSync(downloadPath);
        fileList.forEach((file, index) => {
            console.info(`${downloadPath} ${index}: ${file}`);
            fs.copyFileSync(`${downloadPath}/${file}`, `${dirPath}/${file}`);
        });
        // 查看沙箱目录下对应的文件
        fileList = fs.listFileSync(dirPath);
        fileList.forEach((file, index) => {
            console.info(`${dirPath} ${index}: ${file}`);
        });
    } catch (error) {
        const err: BusinessError = error as BusinessError;
        console.error(`Error code: ${err.code}, message: ${err.message}`);
    }
}

相关文档:

更多关于HarmonyOS鸿蒙Next中获取用户手机download目录下文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


权限 ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY 的适用范围明确标注为 PC/2in1 | Tablet 设备,而手机设备暂不支持通过此权限直接访问公共Download目录

如果访问应用自身的Download子目录,应用通过 DOWNLOAD 模式保存的文件(如用户下载内容)。无需额外权限,但只能访问应用自身目录下的文件。

如果访问非自身的目录,建议通过 FilePicker 系统文件选择器,调用系统文件选择器,用户主动选择文件后获取临时访问权限。

试试这个看看

在鸿蒙(HarmonyOS)中获取用户手机Download目录下的文件,需结合权限申请、公共目录路径获取及文件操作接口实现。以下是具体实现步骤和注意事项:

  1. 申请访问权限

权限声明:在module.json5文件中添加权限声明:

"requestPermissions": [
  "ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY"
]

动态权限申请:在代码中动态请求权限:

import abilityAccessCtrl from '@kit.AbilityKit';
let context = ... // 获取UIAbilityContext
let permissions: Array<string> = ['ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY'];
abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context, permissions)
  .then((data) => {
    if (data.authResults === 0) {
      console.info("权限申请成功");
    }
  });
  1. 获取Download目录路径使用Environment接口获取公共目录路径:
import { Environment } from '@kit.CoreFileKit';
try {
  const downloadPath = Environment.getUserDownloadDir();
  console.info(`Download目录路径:${downloadPath}`);
} catch (error) {
  console.error(`获取路径失败:${error.code}, ${error.message}`);
}

注意:需确保设备支持SystemCapability.FileManagement.File.Environment.FolderObtain能力。

  1. 文件操作

3.1 通过文件选择器(FilePicker)访问文件

import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
// 创建文件选择器实例
let documentPicker = new picker.DocumentViewPicker();
// 选择文件
documentPicker.select().then((uris) => {
  let uri = uris;
  let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
  let content = fs.readSync(file.fd, { length: 1024 }); // 读取文件内容
  console.info(`文件内容:${content}`);
  fs.closeSync(file);
});

3.2 直接访问Download目录文件

import fs from '@ohos.file.fs';
import { BusinessError } from '@kit.BasicServicesKit';
// 假设已知文件路径为downloadPath + '/example.txt'
let filePath = downloadPath + '/example.txt';
try {
  let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  fs.writeSync(file.fd, 'Hello, HarmonyOS!'); // 写入文件
  fs.closeSync(file);
} catch (error) {
  const err: BusinessError = error as BusinessError;
  console.error(`文件操作失败:${err.code}, ${err.message}`);
}
  1. 注意事项

权限级别变更:READ_WRITE_DOWNLOAD_DIRECTORY从API 12开始权限级别为normal,需动态申请。

设备兼容性:公共目录访问接口当前仅支持2-in-1设备(如平板、PC)。

路径持久化:通过FilePicker获取的文件URI默认是临时授权,需调用fileIo.persistent接口持久化。

文件类型处理:

TXT文件:可直接通过fs.readSync读取文本。

Word文件:需解析二进制内容或依赖第三方库(如.docx解析工具)。

  1. 参考路径格式

Download目录默认路径:/storage/media/100/local/files/Docs/Download(具体路径可能因设备而异)。

通过HDC工具访问:使用DevEco Studio的Device File Browser可直接上传/下载文件到此目录。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

设备兼容性:公共目录访问接口当前仅支持2-in-1设备(如平板、PC)。那手机上是不是就无法访问了,

在HarmonyOS Next中,获取用户手机download目录下的文件,需要使用@ohos.file.fs@ohos.file.environment模块。首先通过environment.getExternalStoragePublicDirectory获取公共下载目录路径,然后使用fs.listFile列出目录中的文件。注意,应用需在module.json5中声明ohos.permission.READ_MEDIA权限。

在HarmonyOS Next中,手机设备上访问公共下载目录(Download)的方式与PC/平板不同,主要使用用户文件访问框架(User File Access Framework)

手机设备上,应用通常通过以下步骤访问用户文件(包括Download目录中的文件):

  1. 使用Picker(文件选择器):这是推荐的方式。应用可以启动系统的文件选择器(PhotoViewPickerDocumentViewPicker等),让用户主动选择并授权应用访问特定文件。这种方式无需声明敏感的文件读写权限,遵循了最小权限原则和用户隐私保护。

    • 核心模块@ohos.file.picker
    • 关键接口:例如使用DocumentViewPicker来选择文档文件。
  2. 申请存储权限:如果需要更广泛的文件访问能力(例如扫描特定目录下的所有文件),可以申请以下权限,并引导用户在系统设置中手动授权:

    • ohos.permission.READ_MEDIA:允许读取用户外部存储中的媒体文件。
    • ohos.permission.WRITE_MEDIA:允许写入用户外部存储中的媒体文件。
    • 申请这些权限后,可以通过@ohos.file.fs等文件管理接口,使用类似路径前缀 + 相对路径(例如 'download/')的方式来访问公共下载目录。但请注意,直接使用绝对路径访问可能受限,通过环境变量或特定接口获取公共目录路径是更安全可靠的做法。

总结与关键点

  • 手机设备:不直接支持ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY权限。优先使用文件选择器(Picker) 让用户授权访问单个或多个文件。
  • 如果需要后台扫描/管理:考虑申请READ_MEDIA/WRITE_MEDIA权限,并使用HarmonyOS提供的标准文件API来访问公共目录。具体路径可通过context或环境变量获取,例如通过getExternalStorageDir()等系统方法(具体API请参考最新文档)来构建访问路径。
  • 权限声明:无论使用哪种方式,如果涉及访问用户文件,通常需要在module.json5文件中声明相应的权限(如READ_MEDIA),并在运行时动态检查并申请。

因此,在HarmonyOS Next的手机设备上,获取Download目录下文件的核心方法是:通过文件选择器由用户主动选择,或申请媒体存储权限后使用标准文件接口进行访问。请根据你的具体应用场景选择合适的方式。

回到顶部