HarmonyOS 鸿蒙Next 如何把系统文件通过uri复制到指定目录中

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

HarmonyOS 鸿蒙Next 如何把系统文件通过uri复制到指定目录中

基本信息

现在App通过picker,拿到了系统图片的uri (举例file://media/Photo/6/IMG_1716190263_005/9b09f2f4e62741558d98d862d432166e(1).jpg)。

现在想要将这个图片,复制到App的私有目录(比如 /data/storage/el2/base/cache )下,请问该如何操作。


困难点,现在鸿蒙的文件系统混乱,看起来有若干套文件相关的管理体系。目测使用linux系统的标准File体系能更好的适配使用。

所以,现在,想要直接把这个文件复制到指定目录下,烦请提供一段示例代码。


更多关于HarmonyOS 鸿蒙Next 如何把系统文件通过uri复制到指定目录中的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

请参考以下demo

import picker from '[@ohos](/user/ohos).multimedia.cameraPicker';
import camera from '[@ohos](/user/ohos).multimedia.camera';
import common from '[@ohos](/user/ohos).app.ability.common';
import { BusinessError } from '[@ohos](/user/ohos).base';
import fileuri from '[@ohos](/user/ohos).file.fileuri';
import fs from '[@ohos](/user/ohos).file.fs';
import photoAccessHelper from '[@ohos](/user/ohos).file.photoAccessHelper';

let context = getContext(this) as common.Context;

class CameraPosition {
 cameraPosition: camera.CameraPosition;
 saveUri: string;

 constructor(cameraPosition: camera.CameraPosition, saveUri: string) {
   this.cameraPosition = cameraPosition;
   this.saveUri = saveUri;
 }
}

let pathDir = getContext().filesDir;
console.log('保存路径为' + pathDir);
let filePath = pathDir + '/picture.jpg';

fs.createRandomAccessFileSync(filePath, fs.OpenMode.CREATE);
let uri = fileuri.getUriFromPath(filePath);

async function photo() {
 try {
   let pickerProfile = new CameraPosition(camera.CameraPosition.CAMERA_POSITION_BACK, uri);
   let pickerResult: picker.PickerResult = await picker.pick(context, [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], pickerProfile);
   console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));
 } catch (error) {
   let err = error as BusinessError;
   console.error(`the pick call failed. error code: ${err.code}`);
 }
}

async function picture() {
 let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
 PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
 PhotoSelectOptions.maxSelectNumber = 1;

 let photoPicker = new photoAccessHelper.PhotoViewPicker();
 try {
   let PhotoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(PhotoSelectOptions);
   let photouri: Array<string> = PhotoSelectResult.photoUris;

   if (photouri.length > 0) {
     let file = fs.openSync(photouri[0], fs.OpenMode.READ_ONLY);
     let file2 = fs.openSync(pathDir + '/picture2.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

     fs.copyFileSync(file.fd, file2.fd);
     fs.closeSync(file);
     fs.closeSync(file2);

     console.log('照片已成功保存');
   } else {
     console.log('未选择任何照片');
   }
 } catch (error) {
   console.error('选择照片失败: ' + error);
 }
}

[@Entry](/user/Entry)
[@Component](/user/Component)
export struct Index {
 build() {
   Column() {
     Button('选择并保存').onClick(() => {
       picture();
     });
     Button('拍照并保存').onClick(() => {
       photo();
     });
   }
 }
}

更多关于HarmonyOS 鸿蒙Next 如何把系统文件通过uri复制到指定目录中的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,通过URI复制系统文件到指定目录通常涉及文件访问权限和URI解析。以下是操作步骤的简要说明:

  1. 获取权限:首先,确保你的应用已声明必要的文件读写权限。在config.json文件中添加对应的权限声明,如ohos.permission.READ_EXTERNAL_STORAGEohos.permission.WRITE_EXTERNAL_STORAGE

  2. URI解析:使用Uri类解析传入的URI,获取文件的路径或内容提供者。鸿蒙系统通常支持content://file://两种URI格式。

  3. 文件操作

    • 如果URI是file://格式,直接解析路径并使用File类进行读写操作。
    • 如果URI是content://格式,需要使用ContentResolver和相应的查询参数来获取文件流,再进行复制。
  4. 复制文件:使用FileInputStream读取源文件,FileOutputStream写入目标文件,完成复制操作。

  5. 异常处理:确保在代码中添加适当的异常处理逻辑,以应对可能的文件访问或IO错误。

请注意,直接操作系统文件可能涉及系统安全和权限管理问题,务必确保操作合法合规。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部