2013-10-17 17 views
13

Ich verwende HTML5 FileWriter API, um den Status meiner Webapp zu speichern. Ich habe ein Bit von JS, das periodisch FileWriter.write aufruft, um das zu tun (so, im Laufe der Zeit, die write Methode wird mehrmals aufgerufen). Standardmäßig verwendet die FileWriter-API einen Append-Ansatz zum Schreiben von Dateien, der meinen Anforderungen nicht entspricht, da ich den Dateiinhalt nicht überschreiben möchte.überschreiben Sie eine Datei mit HTML5 FileWriter

Ich versuchte zunächst, dies:

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

Dies funktioniert nicht, wenn Sie einen Text kürzer als der Dateiinhalt schreiben. Ich habe dann versucht diese:

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

Dieser Code soll die Datei löschen, und dann meine neue Inhalte schreiben, aber ich erhalte die folgende Fehlermeldung, wenn write Methode aufgerufen wird:

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. 

Odd Sache: Wenn ich den Code debuggen (mit einem Haltepunkt), tritt der Fehler nicht auf, als ob FileWriter.truncate eine asynchrone Methode wäre ...

Ich stecke hier, irgendwelche Ideen?

Ich bin mit Chrome 30.0.1599.69

Antwort

20

Hier ist ein richtiger Code, der nicht 500ms verschwenden

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); 
+1

Können Sie das näher erläutern? Was ist "d"? – htulipe

+1

@htulipe, es ist mein jQuery.Delfered-Objekt, das ich extern verwende, um benachrichtigt zu werden, wenn sowohl die Kürzung als auch das Schreiben erfolgt ist. Sie können es ignorieren oder anderen Code hinzufügen, den Sie ausführen möchten, wenn das Schreiben abgeschlossen ist. –

+0

@htulipe Bitte markieren Sie dies als Antwort, wenn es das Problem löst. –

1

Eine Abhilfe ist der folgende Code:

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

Dieses einfach 500 Millisekunden warten, bevor das Schreiben. Nicht so toll, aber es funktioniert ...

3

auf Warten Sie können gestutzt und dann mit zwei verschiedenen FileWriter Objekten schreiben.

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); 
+0

ihre Arbeit dank – Sajan

1

Wenn Sie wollen immer es überschreiben, können Sie diese Methode verwenden

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); 
      }); 
     }); 
    }); 
}; 
1

Dies ist die einfachste Art und Weise, wie ich den Inhalt einer Datei mit syncFileSystem in meinem Chrome App verwenden zu löschen.

Zwei createWriter, kürzt die erste dann überschreibt der zweite mit nichts (Sie mit Ihrem neuen Wert ändern können):

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); 

});