2013-10-17 159 views
13

我使用HTML5 FileWriter API來保存我的web應用程序的狀態。我有點JS定期調用FileWriter.write這樣做(所以,隨着時間的推移,write方法被稱爲幾次)。默認情況下,FileWriter API使用'append'方法來編寫不適合我需求的文件,因爲我不想覆蓋文件內容。用HTML5 FileWriter覆蓋文件

我第一次嘗試這樣的:

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

回答

20

這裏是不會在等待

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

你能否詳細說明?什麼是「d」? – htulipe

+1

@htulipe,這是我在外部使用的jQuery.Deffered對象,在截斷和寫入完成時都會收到通知。寫作完成後,您可以忽略它或添加任何其他想要執行的代碼。 –

+0

@htulipe如果它解決了問題,請將其標記爲答案。 –

1

一種解決方法是如下代碼:

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

這只是在寫之前等待500毫秒。不是很大,但它的工作原理...

3

可以截斷,然後用兩個不同的FileWriter對象寫浪費500ms的一個正確的代碼。

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

其工作感謝 – Sajan

1

如果你想永遠覆蓋它,您可以使用此方法

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

這是我如何使用刪除與syncFileSystem文件的內容在我的Chrome應用最簡單的方法。

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

});