2011-07-22 11 views
9

私はHTML5 File APIを試しています。私は十分知らない方法を使用する必要があります(どこにも書かれていないため)。HTML5 FileWriter truncate()メソッドを使用していますか?

私はFileWriter truncate()メソッドについて話しています。私はそれが私の行う必要があることを知っています。基本的に、一部のファイルデータにテキストを追加するのではなく、seek()を使用して特定の部分を上書きするのではなく、すべてのデータを別のもの(たとえばsomedataから "")に上書きします。

ここでは切り捨てとするHTML5 RocksからしてFileWriterセットアップのスニペットは、(だ)で追加。

function onInitFs(fs) { 

    fs.root.getFile('log.txt', {create: false}, function(fileEntry) { 

    // Create a FileWriter object for our FileEntry (log.txt). 
    fileEntry.createWriter(function(fileWriter) { 

     fileWriter.seek(fileWriter.length); // Start write position at EOF. 
     fileWriter.truncate(1); 

     // Create a new Blob and write it to log.txt. 
     var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12. 
     bb.append('Hello World'); 
     fileWriter.write(bb.getBlob('text/plain')); 

    }, errorHandler); 

    }, errorHandler); 

} 

window.requestFileSystem(window.PERSISTENT, 1024*1024, onInitFs, errorHandler); 

それはwriter.truncate()を呼び出すになると、)(writer.writeを呼び出すと、ファイルの例外エラーがスローされます。これは、readyStateがWRITINGに設定されているためだと思います。残念ながら、私はそれを回避する方法がわかりません。

私は既にHTML5Rocks sectionを調べてみましたが、truncate()メソッドについては何も教えてくれません(Webkit JSコンソールから私には分かりますが)。

短くて、truncate()メソッドをエラーなく正しく使用する方法はありますか?

+2

を指定し、そのファイルの長さを変更しますspec](http://www.w3.org/TR/file-writer-api/#widl-FileWriter-truncate)をお楽しみください。 – Raynos

+0

なぜtruncate(1)ですか?なぜゼロサイズのファイルを得るために切り詰め(0)しないのですか? – huyz

答えて

6

もっと非同期である必要があります。このような

fileEntry.createWriter(function(fileWriter) { 

    fileWriter.onwriteend = function(trunc) { 
    fileWriter.onwriteend = null; // Avoid an infinite loop. 
    // Create a new Blob and write it to log.txt. 
    var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12. 
    bb.append('Hello World'); 
    fileWriter.write(bb.getBlob('text/plain')); 
    } 

    fileWriter.seek(fileWriter.length); // Start write position at EOF. 
    fileWriter.truncate(1); 

}, errorHandler); 
+1

私は間違っているかもしれませんが、あなたが常にonwriteendを起動しているので、これが無限の再帰を引き起こすと私は信じています。したがって、その中からonwriteendを無効にする必要があるかもしれません。 – huyz

+0

良いキャッチ。私が書いたコードでは、私はいつもフォローアップコードを確立するためにonwriteendを置き換えたいと思っていました。私は、非同期の切り捨てを使用するために元のコードを書き換えていましたが、私はonwriteend関数の置き換え/無効化については考えていませんでした。 –

11

何かがポイントにもう少しかもしれません:):

切り捨てはW3C TRUNCATE [

fileEntry.createWriter(function(fileWriter) { 
    var truncated = false; 
    fileWriter.onwriteend = function(e) { 
     if (!truncated) { 
      truncated = true; 
      this.truncate(this.position); 
      return; 
     } 
     console.log('Write completed.'); 
    }; 
    fileWriter.onerror = function(e) { 
     console.log('Write failed: ' + e.toString()); 
    }; 
    var blob = new Blob(['helo'], {type: 'plain/text'}); 
    fileWriter.write(blob); 
}, errorHandler); 
関連する問題