HarmonyOS鸿蒙Next中fs.unlinkSync删除文件成功后如果不刷新模拟器再创建同名文件就出错,刷新一下再创建就没问题
HarmonyOS鸿蒙Next中fs.unlinkSync删除文件成功后如果不刷新模拟器再创建同名文件就出错,刷新一下再创建就没问题 删除文件成功后如果不刷模拟器再创建同名文件就出错,而刷新一下再创建就没问题。排除删除后写入速度过快造成的问题,删除后,只要不刷新设备或模拟器,无论什么时候再创建同名文件就出错:
步骤:先删除文件(fs.unlinkSync),刷新模拟器后可以再创建(fs.openSync)同名文件并写入(fs.writeSync)内容,没问题;如果不刷新再创建同名文件(fs.openSync)后,提示:Error: Operation not permitted;感觉删除文件并不是彻底删除,是锁住了,只有刷新一下才彻底删除。
以上步骤同步方式异步方式都试过,问题一样!
SDK 5.0.4(16)
删除文件代码:
export async function deleteFile(filePath: string='/www', fileName: string='/test.json'): Promise<boolean> {
try{
fs.unlink(filePath + fileName).then(() => {
console.info("remove file succeed");
}).catch((err) => {
console.error("remove file failed with error message: " + err.message);
});
return true
}
catch (e){
return false
}
}
写文件主要代码:
console.info('0.1' + filePath + fileName)
let file = fs.openSync(filePath + fileName, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); //try到这就出错,抛出Error: Operation not permitted错误
console.info('1.1' + filePath + fileName)
fs.writeSync(file.fd, fileBody);
fs.closeSync(file);
更多关于HarmonyOS鸿蒙Next中fs.unlinkSync删除文件成功后如果不刷新模拟器再创建同名文件就出错,刷新一下再创建就没问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在自己设备上matepad pro 11 2024可以成功运行,模拟器环境下却一直出错,奇怪~~
更多关于HarmonyOS鸿蒙Next中fs.unlinkSync删除文件成功后如果不刷新模拟器再创建同名文件就出错,刷新一下再创建就没问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
模拟器就是会有各种问题,以真机的效果为准吧。
你deleteFile这个方法是异步的,把你调用这个方法和下面的创建文件的方法的代码也贴出来看看呢
谢谢回复,这是分别调用异步deleteFile
代码和同步writeFile
代码,(两种方式同步异步都试过,效果一样~~)
//deleteFile
//ets页面
private async handleDeleteFile(): Promise<boolean> {
let returnBool = await deleteFile(this.filePath, this.fileName)
if(returnBool){
……
return true
}
else{
……
return false
}
//writeFile
//ts页面
export function writeFile(filePath: string='www', fileName:string='/test.json', fileBody: string):boolean {
if (!fs.accessSync(filePath, 0)) {
try {
fs.mkdirSync(filePath, true)
}
catch (e) {
return false;
}
}
try {
console.info('0.1' + filePath + fileName)
let file = fs.openSync(filePath + fileName, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); //执行删除文件操作后,刷新这里不出错,不刷新这里就出错
console.info('1.1' + filePath + fileName)
fs.writeSync(file.fd, fileBody);
fs.closeSync(file);
return true;
} catch (e) {
console.info('2' + filePath + fileName + e)
return false;
}
}
//ets页面
private handleWriteFile():void {
let returnBool = writeFile(this.filePath, this.fileName, '[]');
……
}
在HarmonyOS鸿蒙Next中,fs.unlinkSync
删除文件后,文件系统可能未立即更新缓存状态,导致立即创建同名文件时出错。刷新模拟器会强制更新文件系统缓存,解决此问题。建议在删除文件后,手动调用fs.sync
或等待文件系统自动同步,以确保缓存状态正确。
这是一个典型的文件系统缓存同步问题。在HarmonyOS Next中,文件删除操作(unlinkSync)虽然从文件系统中移除了文件,但可能由于系统缓存机制导致文件句柄未完全释放。
解决方案建议:
-
在删除文件后,可以尝试添加短暂延迟(100-200ms)再创建新文件,给系统足够时间完成清理。
-
更可靠的方式是在删除后显式调用fs.sync()强制同步文件系统:
await fs.unlink(filePath + fileName);
await fs.sync(); // 强制同步文件系统
- 或者使用更安全的文件操作模式,在打开文件时添加TRUNC标志:
let file = fs.openSync(filePath + fileName,
fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC);
这个问题的本质是文件系统操作的异步性,虽然API是同步调用,但底层实现可能有延迟。建议优先考虑使用fs.sync()来确保操作完成。