HarmonyOS鸿蒙Next中app清除缓存,清理后去查询,发现还有一部分缓存空间没有全部清除

HarmonyOS鸿蒙Next中app清除缓存,清理后去查询,发现还有一部分缓存空间没有全部清除

CacheUtil.ets

import { fileIo, storageStatistics } from "@kit.CoreFileKit";

// 获取应用缓存数据空间大小
export function getCacheSize() {
  return new Promise<storageStatistics.BundleStats>(async (resolve, reject) => {
    storageStatistics.getCurrentBundleStats()
      .then((bundleStats: storageStatistics.BundleStats) => {
        console.info('getCurrentBundleStats successfully:' + JSON.stringify(bundleStats))
        console.info('appsize :' + bundleStats.appSize)
        console.info('cacheSize :' + bundleStats.cacheSize)
        console.info('dataSize :' + bundleStats.dataSize)
        resolve(bundleStats)
      }).catch((err: Error) => {
        console.error('获取应用缓存空间失败-->', JSON.stringify(err))
        reject(err)
      })
  })
}

// 清理缓存
export function clearCache(context: Context) {
  let cacheDir = context.cacheDir;
  console.info('cacheDir: ', cacheDir);

  fileIo.listFiles(cacheDir).then((filenames) => {
    for (let i = 0; i < filenames.length; i++) {
      let dirPath = cacheDir + '/' + filenames[i];
      console.log(dirPath);
      // 判断是否为文件夹
      let isDirectory: boolean = false;
      try {
        isDirectory = fileIo.statSync(dirPath).isDirectory();
      } catch (e) {
        console.error(JSON.stringify(e));
      }

      if (isDirectory) {
        fileIo.rmdirSync(dirPath);
      } else {
        fileIo.unlink(dirPath).then(() => {
          console.info('remove file succeed')
        }).catch((err: Error) => {
          console.error('remove file failed with error message: ' + err.message);
        });
      }
    }
  })
}

更多关于HarmonyOS鸿蒙Next中app清除缓存,清理后去查询,发现还有一部分缓存空间没有全部清除的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

更多关于HarmonyOS鸿蒙Next中app清除缓存,清理后去查询,发现还有一部分缓存空间没有全部清除的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个缓存有坑,你清理的文件夹只是一部分的,其他的你没有清理到,你获取到的缓存空间还一定都是el2的,而且它这个缓存就没有隔离的说法,缓存目录大小能够影响到临时目录。

缓存的意义何在?是让你清理着玩的吗?清不掉是有原因的!

哈哈,

这是一个段落。

这是一些文本内容。

空图片

这是另一段文本内容。

```

无知。

在HarmonyOS Next中,应用清理缓存后残留部分数据可能由以下原因导致:

  1. 系统保护机制自动保留高频访问的缓存文件
  2. 应用沙箱机制隔离的运行时临时文件
  3. 应用标记为"重要数据"的缓存项(如登录状态)
  4. 分布式服务产生的跨设备同步数据缓存

可通过以下命令查看详细缓存构成:

adb shell du -h /data/data/<package>/cache

残留缓存不影响系统运行,属于HarmonyOS的设计特性。

在HarmonyOS Next中,清理缓存后仍有部分空间未被清除,这通常是由于以下几个原因:

  1. 系统缓存机制:部分缓存可能由系统自动管理,应用层无法直接清除。BundleStats中的cacheSize可能包含这部分系统管理的缓存。

  2. 异步删除延迟:unlink和rmdirSync操作是异步的,统计信息可能不会立即更新。建议在清理完成后延迟1-2秒再查询。

  3. 子目录处理:当前代码只处理一级目录,如果缓存是多级嵌套的,需要使用递归删除:

function deleteRecursive(path: string) {
  if (fileIo.statSync(path).isDirectory()) {
    let files = fileIo.listFileSync(path);
    files.forEach(file => {
      deleteRecursive(`${path}/${file}`);
    });
    fileIo.rmdirSync(path);
  } else {
    fileIo.unlinkSync(path);
  }
}
  1. 特殊文件锁定:某些缓存文件可能被系统或其他进程锁定,导致无法删除。可以尝试使用try-catch捕获异常并记录。

建议在清理完成后调用storageStatistics.getCurrentBundleStats()前添加短暂延迟,并检查是否处理了所有嵌套目录。

回到顶部