首页 > 解决方案 > 科尔多瓦插件文件干净覆盖文件

问题描述

在使用 cordova-plugin-file Cordova 插件时,我正在寻找一种干净且安全的方法来完全覆盖现有文件。我发现,即使使用该exclusive: false选项,如果新文件内容比现有文件,现有文件的其余部分仍会保留在新文件的末尾。

例子。我有一个内容为 的现有文件0123456789,并希望将其替换为abcd. 使用时exclusive: false,我最终得到的文件的内容为abcd456789

显然,这会在回读时导致复杂化,尤其是当我希望这些文件是正确的 json 文件时。

我一直无法找到不只是简单地说 use 的其他答案exclusive: false

到目前为止,我可以通过先手动删除文件然后写入文件来解决这个问题,但这给我留下了一个点,如果应用程序在错误的时刻关闭,我就有丢失整个文件数据的风险。

另一种选择可能是写入临时文件,然后删除现有文件,然后复制临时文件,然后删除临时文件。阅读时,检查我想要的文件,如果不存在,检查临时文件,如果存在则复制并清理。对于应该是一种选择的东西,这感觉像是一个非常冗长的工作。

我在这里错过了什么吗?

这是我现有的工作,尽管它还没有处理应用程序关闭的可能性。在我不得不进入那个兔子洞之前,有没有更好的方法?

  private replaceFileAtPath<T>(path: string, data: T): void {
    FileService.map.Settings.getFile(path, { create: true }, fileEntry => {
      fileEntry.remove(() => {})
      FileService.map.Settings.getFile(path, { create: true }, fe =>
        this.writeFile(fe, data)
      )
    })
  }

  private writeFile<T>(file: FileEntry, data: T, cb?: () => void): void {
    file.createWriter(writer => {
      const blob = new Blob([JSON.stringify(data)], { type: 'application/json' })

      writer.write(blob)
    })
  }

标签: javascripttypescriptcordovacordova-pluginscordova-plugin-file

解决方案


我想我找到了解决这个问题的方法。

您可以使用 HTML5 FileWriter truncate() 方法。

    file.createWriter(writer => {
      const blob = new Blob([JSON.stringify(data)], { type: 'application/json' })
      const truncated = false;
      writer.onwriteend = function() {
        if (!truncated) {
          truncated = true;
          this.truncate(this.position);
          return;
        }
      };
      writer.write(blob)
    })

推荐阅读