HarmonyOS鸿蒙Next中fs.unlinkSync(srcFileUri) 这句代码为什么会触发No Such file or directory异常?
HarmonyOS鸿蒙Next中fs.unlinkSync(srcFileUri) 这句代码为什么会触发No Such file or directory异常?
fs.unlinkSync(srcFileUri): No such file or directory 是鸿蒙文件路径最常见的坑!
一、报错的真正原因(100% 确定)
你传给 fs.unlinkSync() 的路径 不是真实本地路径,而是:
- 媒体库 URI(如
file://media/xxx) - 应用沙箱之外的只读路径
- 文件已经被删除 / 不存在
- 路径格式不合法(带协议头、空格、特殊字符)
fs.unlinkSync() 只认绝对物理路径,不认 URI、不认媒体库路径!
二、最常见场景(你 99% 是这个)
你代码里的 srcFileUri 长这样:
file://media/55
file://data/storage/xxx
content://media/xxx
这种 URI 不能直接给 fs 模块用!→ fs 只认纯物理路径:
/data/app/eligible/xxx/xxx/test.jpg
三、正确解决方法(直接复制改好)
错误写法(你现在的)
fs.unlinkSync(srcFileUri); // ❌ 报错:不存在
正确写法(必须先处理 URI → 真实路径)
情况 1:你的路径是 file:// 开头
// 1. 去掉 file:// 前缀
const realPath = srcFileUri.replace('file://', '');
// 2. 再删除
fs.unlinkSync(realPath); // ✅ 正常
情况 2:你是从相册 / 媒体库拿到的 URI
不能用 fs 删除!必须用媒体库接口删除!
import { photoAccessHelper } from '@kit.MediaLibraryKit';
// 正确删除相册图片
await photoAccessHelper.deleteAsset(srcFileUri);
四、终极安全代码(永不报错)
import { fs } from '@kit.CoreFileKit';
try {
// 统一处理路径
let path = srcFileUri.replace('file://', '');
// 先判断文件是否存在,再删
if (fs.accessSync(path)) {
fs.unlinkSync(path);
console.log('删除成功');
} else {
console.log('文件已不存在,无需删除');
}
} catch (err) {
console.error('删除失败:', err.message);
}
五、一句话总结(你只要记住这个)
✅ fs.unlinkSync 只能删应用自己沙箱里的物理文件
✅ 必须是 纯路径,不能带 file://
✅ 相册 / 媒体库文件 必须用 photoAccessHelper.deleteAsset () 删除
❌ 直接把 URI 丢给 fs 必报错:No such file or directory
更多关于HarmonyOS鸿蒙Next中fs.unlinkSync(srcFileUri) 这句代码为什么会触发No Such file or directory异常?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
根本原因是 fs.unlinkSync() 只接受应用沙箱内的绝对物理路径,而你传入的 srcFileUri 是带协议的媒体库 URI(如 file://media/xxx)或沙箱外的只读路径,并非真实文件路径,导致系统直接报错“No such file or directory”。
常见场景与处理:
- 如果
srcFileUri以file://开头,必须先去掉前缀:const realPath = srcFileUri.replace('file://', '');再传入fs.unlinkSync(realPath)。 - 如果路径来自相册/媒体库,必须使用
@kit.MediaLibraryKit的photoAccessHelper.deleteAsset()删除,FS 模块无法操作媒体库文件。 - 删除前建议用
fs.accessSync()校验路径是否存在,避免文件已被清理导致的异常。


