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

6 回复

在自己设备上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)虽然从文件系统中移除了文件,但可能由于系统缓存机制导致文件句柄未完全释放。

解决方案建议:

  1. 在删除文件后,可以尝试添加短暂延迟(100-200ms)再创建新文件,给系统足够时间完成清理。

  2. 更可靠的方式是在删除后显式调用fs.sync()强制同步文件系统:

await fs.unlink(filePath + fileName);
await fs.sync(); // 强制同步文件系统
  1. 或者使用更安全的文件操作模式,在打开文件时添加TRUNC标志:
let file = fs.openSync(filePath + fileName, 
  fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC);

这个问题的本质是文件系统操作的异步性,虽然API是同步调用,但底层实现可能有延迟。建议优先考虑使用fs.sync()来确保操作完成。

回到顶部