14

我正在使用HTML5 FileWriter API来保存我的 webapp 的状态。我有一些 JS 会定期调用FileWriter.write来执行此操作(因此,随着时间的推移,该write方法会被多次调用)。默认情况下,FileWriter API 使用“附加”方法来写入不适合我需要的文件,因为我不想覆盖文件内容。

我首先尝试了这个:

this._writer.seek(0);
this._writer.write(content);

当您编写的文本比文件内容短时,这不起作用。然后我尝试了这个:

this._writer.truncate(0);
this._writer.write(content);

此代码应该清除文件然后写入我的新内容,但是在write调用方法时出现以下错误:

Uncaught InvalidStateError: An operation that depends on state cached in an interface object was made but the state had changed since it was read from disk.

奇怪的事情:当我调试代码时(带断点),错误没有发生,好像FileWriter.truncate是一个异步方法......

我被困在这里,有什么想法吗?

我正在使用 Chrome 30.0.1599.69

4

5 回答 5

22

这是一个不会浪费 500 毫秒等待的正确代码

fileWriter.onwriteend = function() {
    if (fileWriter.length === 0) {
        //fileWriter has been reset, write file
        fileWriter.write(blob);
    } else {
        //file has been overwritten with blob
        //use callback or resolve promise
    }
};
fileWriter.truncate(0);
于 2013-12-05T08:05:44.487 回答
3

您可以截断然后用两个不同的FileWriter对象写入。

fileEntry.createWriter(function (fileWriter) {

        fileWriter.truncate(0);

    }, errorHandler);

fileEntry.createWriter(function (fileWriter) {

        var blob = new Blob(["New text"], { type: 'text/plain' });

        fileWriter.write(blob);

    }, errorHandler);
于 2015-11-14T16:14:35.323 回答
2

如果您想始终覆盖它,可以使用此方法

function save(path,data){
    window.resolveLocalFileSystemURL(dataDirectory, function(dir){
        dir.getFile(path, {create:true}, function(file){
            file.createWriter(function(fileWriter){
                fileWriter.seek(0);
                fileWriter.truncate(0);
                var blob = new Blob([data], {type:'text/plain'});
                fileWriter.write(blob);
            }, function(e){
                console.log(e);
            });
        });
    });
};
于 2016-03-16T00:24:22.460 回答
1

解决方法是以下代码:

this._writer.truncate(0);
window.setTimeout(function(){
    this._writer.write(content);
}.bind(this),500)

这只是在写入前等待 500 毫秒。不是很好,但它的工作...

于 2013-10-17T14:03:47.433 回答
1

这是我在 Chrome 应用程序中使用 syncFileSystem 删除文件内容的最简单方法。

两个 createWriter,第一个截断,然后第二个不覆盖任何内容(您可以使用新值进行更改):

file.createWriter((fileWriter)=>fileWriter.truncate(0));

file.createWriter((fileWriter)=> {

  fileWriter.onwriteend = function() {
    console.log('New Actions!');
  };

  var blob = new Blob([''], {type: 'text/plain'});
  fileWriter.write(blob);

});
于 2017-06-22T19:10:40.633 回答