我正在寻找一种使用cordova-plugin-file Cordova插件完全覆盖现有文件的干净安全的方法。我发现,即使使用exclusive: false
选项,如果新文件的内容比现有文件的短,现有文件的其余部分仍会保留在文件末尾新文件。
示例。我有一个内容为0123456789
的现有文件,并希望将其替换为abcd
。当使用exclusive: false
时,我最终得到的文件的内容为abcd456789
显然,这会在回读时引起复杂性,特别是当我希望这些文件是正确的json时。
我一直无法找到其他答案,而不仅仅是简单地说使用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)
})
}
答案 0 :(得分:0)
我想我找到了解决此问题的方法。
您可以使用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)
})