HarmonyOS 鸿蒙Next 如何把系统文件通过uri复制到指定目录中
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
请参考以下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解析。以下是操作步骤的简要说明:
-
获取权限:首先,确保你的应用已声明必要的文件读写权限。在
config.json
文件中添加对应的权限声明,如ohos.permission.READ_EXTERNAL_STORAGE
和ohos.permission.WRITE_EXTERNAL_STORAGE
。 -
URI解析:使用
Uri
类解析传入的URI,获取文件的路径或内容提供者。鸿蒙系统通常支持content://
和file://
两种URI格式。 -
文件操作:
- 如果URI是
file://
格式,直接解析路径并使用File
类进行读写操作。 - 如果URI是
content://
格式,需要使用ContentResolver
和相应的查询参数来获取文件流,再进行复制。
- 如果URI是
-
复制文件:使用
FileInputStream
读取源文件,FileOutputStream
写入目标文件,完成复制操作。 -
异常处理:确保在代码中添加适当的异常处理逻辑,以应对可能的文件访问或IO错误。
请注意,直接操作系统文件可能涉及系统安全和权限管理问题,务必确保操作合法合规。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。