HarmonyOS鸿蒙Next中实现用户文件的本地备份与恢复/文件压缩/文件解压

HarmonyOS鸿蒙Next中实现用户文件的本地备份与恢复/文件压缩/文件解压 https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/tutorials_File-Bckup

想要实现将文件压缩保存至应用沙箱路径的功能,我们可以分为以下三步:

  1. 将图库文件打开并拷贝至沙箱路径。
  2. 将拷贝好的文件进行压缩。
  3. 将拷贝好的文件删除。

1) 文件拷贝

需要依赖fileIo模块提供的基础文件操作能力,包括fileIo.openSync()、fileIo.closeSync()等。

我们定义一个名为copyfile2Application()的方法,在该方法中整合出压缩文件并保存至沙箱路径的功能。

i):使用fileIo.openSync()打开文件。

ii):为了防止文件名重复,我们在导入文件时获取当前的时间戳作为文件名。

iii):outputPath即为我们想要的压缩文件的路径,分别打开输入路径和输出路径,并通过copyFileSync()方法完成拷贝,然后调用closesync()方法关闭文件,最后调用我们封装好的压缩方法compressFile()和删除方法delete()。

// entry/src/main/ets/common/utils/FileOperate.ets
import { fileIo } from '[@kit](/user/kit).CoreFileKit';
import { systemDateTime } from '[@kit](/user/kit).BasicServicesKit';
import { zlib } from '[@kit](/user/kit).BasicServicesKit';

const uiContext: UIContext | undefined = AppStorage.get('uiContext');

export class FileOperate {
  private context = uiContext!.getHostContext()!;

  async copyFile2Application(inputPath: string): Promise<string> {
    let inputStream = fileIo.openSync(inputPath, fileIo.OpenMode.READ_ONLY);
    let time = systemDateTime.getTime(true);
    let outputPath =
      this.context.filesDir + '/' + JSON.stringify(time) + '.' + inputStream.name.split('.').reverse()[0];
    let outputStream = fileIo.openSync(outputPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
    fileIo.copyFileSync(inputStream.fd, outputStream.fd);
    fileIo.closeSync(outputStream);
    fileIo.closeSync(inputStream);
    let compressionPath = this.context.filesDir + '/' + JSON.stringify(time) + '.zip';
    await this.compressFile(outputPath, compressionPath);
    this.delete(outputPath);
    return compressionPath;
  }
  
  async copyFile2Document(inputFile: string, outputFile: string) {
    let inputStream = fileIo.openSync(inputFile, fileIo.OpenMode.READ_ONLY);
    let outputStream = fileIo.openSync(outputFile, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
    fileIo.copyFileSync(inputStream.fd, outputStream.fd);
    return outputFile;
  }

  delete(path: string) {
    fileIo.unlinkSync(path);
  }

  async compressFile(inFile: string, outFile: string) {
    let options: zlib.Options = {};
    await zlib.compressFile(inFile, outFile, options);
  }
}

2) 压缩文件

通过调用@kit.BasicServicesKit提供的zlib模块实现。

// entry/src/main/ets/common/utils/FileOperate.ets
import { zlib } from '[@kit](/user/kit).BasicServicesKit';

export class FileOperate {
  async compressFile(inFile: string, outFile: string) {
    let options: zlib.Options = {};
    await zlib.compressFile(inFile, outFile, options);
  }
}

3) 删除文件

需要使用fileIo.unlinkSync方法,该方法需要传入待删除文件的沙箱路径

// entry/src/main/ets/common/utils/FileOperate.ets
import { fileIo } from '[@kit](/user/kit).CoreFileKit';
import { zlib } from '[@kit](/user/kit).BasicServicesKit';

export class FileOperate {
  delete(path: string) {
    fileIo.unlinkSync(path);
  }

  async compressFile(inFile: string, outFile: string) {
    let options: zlib.Options = {};
    await zlib.compressFile(inFile, outFile, options);
  }
}

更多关于HarmonyOS鸿蒙Next中实现用户文件的本地备份与恢复/文件压缩/文件解压的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,用户文件的本地备份与恢复可通过FileManager API实现,支持选择目录和文件进行备份操作。备份数据可存储于设备本地安全区域。恢复时通过相同API读取备份文件还原至指定路径。

文件压缩使用ZipUtils工具类,调用compress()方法传入源文件路径与压缩包输出路径即可生成ZIP格式压缩文件。

文件解压通过ZipUtils的decompress()方法,指定ZIP文件路径和解压目标目录完成解压。所有操作均基于鸿蒙系统自带的文件管理接口完成。

更多关于HarmonyOS鸿蒙Next中实现用户文件的本地备份与恢复/文件压缩/文件解压的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中实现文件备份与压缩功能,代码实现思路清晰。使用@kit.CoreFileKit的fileIo模块处理文件操作,@kit.BasicServicesKit的zlib模块进行压缩是标准做法。

copyFile2Application方法的设计合理:通过时间戳命名避免重复,先拷贝到沙箱再压缩,最后删除临时文件。注意文件流操作后及时调用closeSync()释放资源。

compressFile方法调用zlib.compressFile()实现压缩,支持配置压缩参数。删除操作使用fileIo.unlinkSync(),需确保路径正确。

整体代码结构完整,涵盖了文件备份压缩的核心流程。实际开发中需注意异常处理,如文件打开失败、压缩异常等情况,确保操作可靠性。

回到顶部