HarmonyOS鸿蒙Next中如何获取沙箱目录下的文件,并删除应用沙箱目录中的文件?

HarmonyOS鸿蒙Next中如何获取沙箱目录下的文件,并删除应用沙箱目录中的文件? 事情是这样的,app在下载网络图片到本地的沙箱目录,对应的目录是:/data/storage/el2/base/haps/entry/files/

现在想把这个目录下创建的文件给删除掉,这些文件我就不需要它在本地存储了,我需要把它们删除掉。

那么如何删除应用沙箱目录的图片呢?

12 回复

【背景知识】 应用沙箱目录是安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问,开发者可以使用Device File Browser访问设备文件。 应用沙箱路径下通过[@ohos.file.fs](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs)读写文件,经过映射转换,实际读写的是真实物理路径中的应用文件。

【解决方案】

  • 查看正在调试的设备的沙箱文件:

    • 通过IDE的可视化工具Device File Browser中查看设备文件目录,该工具可以在IDE中通过View -> Tool Windows -> Device FIle Browser打开,Device File Browser对应沙箱目录如下:/data/app/el2/100/base/com.example.myapplication/haps/entry/files/first.html。
    • 通过命令行的方式访问debug应用的沙箱目录,API 15前后的系统版本访问方式不同,参考:命令行方式访问应用沙箱
  • 获取沙箱路径下的文件列表: fs.listFile列出文件夹下所有文件名,支持递归列出所有文件名(包含子目录下),支持文件过滤,代码示例如下:

import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs, Filter, ListFileOptions } from '@kit.CoreFileKit';
let listFileOption: ListFileOptions = {
  recursion: false,
  listNum: 0,
  filter: {
    suffix: [".png", ".jpg", ".jpeg"],
    displayName: ["*abc", "efg*"],
    fileSizeOver: 1024
  }
}
fs.listFile(pathDir, listFileOption).then((filenames: Array<string>) => {
  console.info("listFile succeed");
  for (let i = 0; i < filenames.length; i++) {
    console.info("fileName: %s", filenames[i]);
  }
}).catch((err: BusinessError) => {
  console.error("list file failed with error message: " + err.message + ", error code: " + err.code);
});
  • 读取沙箱路径下的文件: 以读取json文件为例,首先通过openSync打开沙箱文件路径,然后fs.writeSync将数据写入文件,最后通过fs.readTextSync直接读取文件的文本内容,代码示例如下:
import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

@Entry
@Component
struct Page {

  build() {
    Column() {
      Text("读取文件测试")
        .padding(40)
        .onClick(()=>{
          let context = this.getUIContext().getHostContext() as common.Context
          let pathDir = context.filesDir;
          let filePath = pathDir + "/test.json";
          let json:ESObject = {key:1}
          let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
          let writeLen = fs.writeSync(file.fd, JSON.stringify(json));
          let json2 = fs.readTextSync(filePath)
          console.info("读取的json:" + json2);
          fs.closeSync(file);
        })
    }
  }
}
  • 删除沙箱路径文件:
    • fs.rmdir接口支持删除单个文件,但不推荐使用此方法删除单个文件,推荐使用unlink接口删除单个文件。
import { BusinessError } from '@kit.BasicServicesKit';
let dirPath = pathDir + "/testDir";
fs.rmdir(dirPath).then(() => {
  console.info("rmdir succeed");
}).catch((err: BusinessError) => {
  console.error("rmdir failed with error message: " + err.message + ", error code: " + err.code);
});
  • fs.unlink接口删除单个文件,使用promise异步回调。
import { BusinessError } from '@kit.BasicServicesKit';
let filePath = pathDir + "/test.txt";
fs.unlink(filePath).then(() => {
  console.info("remove file succeed");
}).catch((err: BusinessError) => {
  console.error("remove file failed with error message: " + err.message + ", error code: " + err.code);
});

更多关于HarmonyOS鸿蒙Next中如何获取沙箱目录下的文件,并删除应用沙箱目录中的文件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


好的,好的,

通过应用上下文(Context)获取不同类型的沙箱路径

// 文件存储目录:/data/storage/el2/base/files
const filesDir = getContext().filesDir; 

// 缓存目录:/data/storage/el2/base/cache
const cacheDir = getContext().cacheDir;

// 临时目录:/data/storage/el2/base/temp
const tempDir = getContext().tempDir;
import { fileIo as fs } from '@kit.CoreFileKit';

// 同步检查文件存在性后删除
if (fs.accessSync(filePath)) {
  fs.unlinkSync(filePath); // 删除文件
}

// 异步删除示例
async function deleteFile(path: string) {
  try {
    await fs.unlink(path);
  } catch (err) {
    console.error(`删除失败: ${err.message}`);
  }
}

好的,好的,

通过上下文获取 filesDir,再拼接你的文件相对路径

删除沙箱文件或者目录的代码

import { fileIo } from '@kit.CoreFileKit'

const path = this.context.filesDir + '/xxx.txt'

// 删除文件或目录
const stat = await fileIo.stat(path);
if (stat.isDirectory()) {
   fileIo.rmdirSync(path);
} else {
   fileIo.unlinkSync(path);
}

好的,好的,

参考下这个示例:

import fs from '@ohos.file.fs';

// 删除指定文件

function deleteFile(fileName: string) {
  let sandboxPath = getContext().filesDir;
  let filePath = `${sandboxPath}/${fileName}`;
  try {
    if (fs.accessSync(filePath)) {
      fs.unlinkSync(filePath);
      console.log(`${fileName} 已删除`);
    }
  } catch (error) {
    console.error(`操作失败:${error.code}, ${error.message}`);
  }
}

// 清空整个目录

function clearDirectory() {
  let sandboxPath = getContext().filesDir;
  let files = fs.listFile(sandboxPath, { recursion: false });
  files.forEach((fileName: string) => {
    let fullPath = `${sandboxPath}/${fileName}`;
    try {
      fs.unlinkSync(fullPath);
    } catch (error) {
      console.error(`删除${fileName}失败:${error.message}`);
    }
  });
}

【背景知识】 [@ohos.file.fs(文件管理)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs):提供基础文件操作能力,包括文件基本管理、文件目录管理、文件信息统计、文件流式读写等常用功能。

【参考方案】: 可参考清除应用缓存示例,通过[@ohos.file.fs](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-fs)实现缓存清理。修改对应的沙箱路径,即可删除对应文件夹下的文件。

  1. 通过getHostContext()application.createModuleContext()获取以下四个文件缓存路径,存储至paths数组。

    moduleContext = await application.createModuleContext(getContext(), 'entry');
    // 缓存路径 /data/storage/el2/base/cache
    paths.push(moduleContext.cacheDir);
    // 缓存路径 /data/storage/el2/base/haps/entry/cache
    paths.push(this.context.cacheDir);
    // 缓存路径 /data/storage/el1/base/cache
    moduleContext.area = contextConstant.AreaMode.EL1;
    paths.push(moduleContext.cacheDir);
    // 缓存路径 /data/storage/el1/base/haps/entry/cache
    context.area = contextConstant.AreaMode.EL1;
    paths.push(this.context.cacheDir);
    
  2. 遍历paths数组,调用deleteFile()清除缓存文件。

    clearAllCache() {
      this.paths.forEach((cacheDir) => {
        hilog.info(0x0000, 'CacheClean', cacheDir);
        this.deleteFile(cacheDir);
      });
    }
    

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

好的,好的,

在HarmonyOS Next中,通过Context对象获取沙箱目录路径。使用getFilesDir()获取应用文件目录,getCacheDir()获取缓存目录。删除文件时调用fs.unlink()fileio.unlink()接口指定路径进行删除操作。需注意文件权限及路径正确性。

在HarmonyOS Next中,可以通过Context获取应用沙箱目录路径,使用ohos.file.fs模块进行文件操作。以下是删除沙箱目录中文件的方法:

  1. 获取沙箱目录路径:
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';

// 获取应用上下文
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir; // 对应 /data/storage/el2/base/haps/entry/files/
  1. 删除指定文件:
let filePath = filesDir + '/filename.jpg'; // 替换为实际文件名
try {
  fs.accessSync(filePath);
  fs.unlinkSync(filePath);
  console.log('文件删除成功');
} catch (err) {
  console.error('删除文件失败: ' + JSON.stringify(err));
}
  1. 删除目录下所有文件:
let dir = filesDir;
try {
  let list = fs.listFileSync(dir);
  list.forEach(file => {
    let fullPath = dir + '/' + file;
    fs.unlinkSync(fullPath);
  });
  console.log('目录清理完成');
} catch (err) {
  console.error('清理目录失败: ' + JSON.stringify(err));
}

注意:操作前请确保文件路径正确,并处理可能出现的异常情况。

回到顶部