HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹
HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹 里面的文件可能很多,不能一个个复制到沙箱目录里面后再进行压缩再复制出来吧,请问有什么办法吗?
更多关于HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹的实战教程也可以访问 https://www.itying.com/category-93-b0.html
通过Environment模块获取Documents目录路径后,将整个文件夹一次性拷贝到沙箱路径,再进行压缩/解压操作
实现步骤
1/获取Documents目录路径并申请权限
import { Environment } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
async function getDocumentsDir() {
try {
const docPath = await Environment.getUserDocumentDir();
console.info("Documents Path:", docPath);
return docPath;
} catch (error) {
console.error("Error code:", (error as BusinessError).code);
}
}
在module.json5中添加:
"requestPermissions": [
{
"name": "ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY"
}
]
2/批量拷贝文件夹到沙箱
import { fileIo as fs } from '@kit.CoreFileKit';
async function copyFolderToSandbox(sourceDir: string, targetDir: string) {
try {
// 创建目标目录
fs.mkdirSync(targetDir);
// 遍历源目录
const files = fs.listFileSync(sourceDir);
files.forEach(file => {
const srcPath = `${sourceDir}/${file}`;
const destPath = `${targetDir}/${file}`;
if (fs.statSync(srcPath).isDirectory()) {
copyFolderToSandbox(srcPath, destPath); // 递归处理子目录
} else {
fs.copyFileSync(srcPath, destPath);
}
});
} catch (error) {
console.error("Copy failed:", (error as BusinessError).message);
}
}
3/执行压缩操作
import { zlib } from '@kit.BasicServicesKit';
async function compressFolder() {
const docPath = await getDocumentsDir();
const sandboxPath = getContext().filesDir + "/temp_compress";
// 拷贝整个文件夹到沙箱
await copyFolderToSandbox(docPath + "/target_folder", sandboxPath);
// 压缩文件夹
const zipPath = getContext().filesDir + "/compressed.zip";
try {
await zlib.compressFile(sandboxPath, zipPath);
// 将压缩包移回Documents目录
fs.copyFileSync(zipPath, docPath + "/compressed.zip");
} catch (error) {
console.error("Compress error:", (error as BusinessError).message);
}
}
4/执行解压操作
async function decompressFile() {
const docPath = await getDocumentsDir();
const zipPath = docPath + "/compressed.zip";
const sandboxZipPath = getContext().filesDir + "/temp.zip";
const sandboxUnzipPath = getContext().filesDir + "/uncompressed";
// 拷贝压缩包到沙箱
fs.copyFileSync(zipPath, sandboxZipPath);
try {
await zlib.decompressFile(sandboxZipPath, sandboxUnzipPath);
// 将解压结果移回Documents目录
await copyFolderToSandbox(sandboxUnzipPath, docPath + "/restored_folder");
} catch (error) {
console.error("Decompress error:", (error as BusinessError).message);
}
}
更多关于HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
1.获取到公共目录的文件路径
import { BusinessError } from '@kit.BasicServicesKit';
function getUserDownloadDirExample() {
try {
let path = Environment.getUserDownloadDir();
console.info(`Succeeded in getUserDownloadDir, path is ${path}`);
} catch (err) {
console.error(`Failed to getUserDownloadDir. Code: ${err.code}, message: ${err.message}`);
}
}
参考文档:[@ohos.file.environment (目录环境能力)-ArkTS API-Core File Kit(文件基础服务)-应用框架 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-environment#environmentgetuserdownloaddir)
2.将对应的文件通过copyFileSync将文件复制到对应的目录中去
通过Environment.getUserDocumentDir()获取Documents目录沙箱路径,无需将文件逐个复制到应用沙箱内
import { Environment } from '@kit.CoreFileKit';
const documentDir = Environment.getUserDocumentDir(); // 获取沙箱Documents路径
批量压缩
import { zlib, BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';
async function compressFolder(sourceDir: string, outputZip: string) {
try {
// 递归获取所有文件路径
const fileList: string[] = [];
const scanDir = (dir: string) => {
const entries = fs.listFileSync(dir);
entries.forEach(entry => {
const fullPath = `${dir}/${entry}`;
if (fs.statSync(fullPath).isDirectory()) {
scanDir(fullPath);
} else {
fileList.push(fullPath); // 记录绝对路径
}
});
};
scanDir(sourceDir);
// 生成压缩参数(保留相对路径)
const options: zlib.Options = {
include: fileList.map(file => ({
src: file,
dest: file.replace(sourceDir, '') // 去除公共目录前缀
}))
};
// 执行压缩
await zlib.compressFile(sourceDir, outputZip, options);
} catch (error) {
const err = error as BusinessError;
console.error(`Compress error: ${err.code}, ${err.message}`);
}
}
// 调用示例
const sourceFolder = `${documentDir}/target_folder`;
const outputPath = `${documentDir}/archive.zip`;
compressFolder(sourceFolder, outputPath);
参考地址
https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-oh-environment-h
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
不能直接通过沙箱路径访问,但你不需要手动复制到沙箱再压缩,可以通过使用 FileAccessHelper 提供的 URI 权限 + 临时文件句柄方式
如果你了解文件复制的本质的话,你会发现原理真的是一个个复制的哎~
在HarmonyOS鸿蒙Next中,使用@ohos.file.fs
和@ohos.file.archive
模块进行文件夹压缩和解压。通过fs.listFile
获取Documents目录下目标文件夹内容,使用archive.zip
方法压缩为zip格式。解压时调用archive.decompress
指定目标路径。操作需申请ohos.permission.FILE_ACCESS和ohos.permission.WRITE_MEDIA权限。
在HarmonyOS Next中,可以通过@ohos.file.fs
和@ohos.file.archive
模块直接操作公共目录中的文件,无需复制到沙箱目录。以下是具体步骤:
- 获取公共目录路径:使用
getOrCreateDir
获取Documents目录的File实例。 - 压缩文件夹:使用
archive.zip()
方法,指定源文件夹路径和目标压缩文件路径。 - 解压操作:使用
archive.decompress()
方法,直接解压到目标文件夹。
示例代码(压缩):
import fs from '@ohos.file.fs';
import archive from '@ohos.file.archive';
// 获取Documents目录
let documentsDir = fs.getOrCreateDir(fs.PathDir.DOCUMENTS);
// 压缩文件夹
let sourceDir = documentsDir.path + '/yourFolder';
let zipPath = documentsDir.path + '/compressed.zip';
archive.zip(sourceDir, zipPath, (err) => {
if (err) {
console.error('压缩失败');
} else {
console.log('压缩成功');
}
});
解压类似,使用archive.decompress()
方法。注意处理权限和路径正确性。