HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹

HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹 里面的文件可能很多,不能一个个复制到沙箱目录里面后再进行压缩再复制出来吧,请问有什么办法吗?

cke_211.png


更多关于HarmonyOS鸿蒙Next中如何压缩和解压公共目录Documents里面的某个文件夹的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

通过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目录沙箱路径,一次复制文件夹应该是可以的

通过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模块直接操作公共目录中的文件,无需复制到沙箱目录。以下是具体步骤:

  1. 获取公共目录路径:使用getOrCreateDir获取Documents目录的File实例。
  2. 压缩文件夹:使用archive.zip()方法,指定源文件夹路径和目标压缩文件路径。
  3. 解压操作:使用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()方法。注意处理权限和路径正确性。

回到顶部