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

切り捨ててから、2 つの異なる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 に答える