【问题标题】:Using the HTML5 FileWriter truncate() method?使用 HTML5 FileWriter truncate() 方法?
【发布时间】:2011-10-11 04:18:24
【问题描述】:

我正在试验 HTML5 文件 API,我需要使用一种我不太了解的方法(仅仅是因为它几乎没有在任何地方记录)。

我说的是 FileWriter truncate() 方法,我知道它可以完成我需要做的事情。基本上,我不想将文本附加到某些文件数据或使用 seek() 覆盖某个部分,而是想用其他东西覆盖所有数据(例如从“somedata”到“”)。

这是来自 HTML5Rocks 的 FileWriter 设置的 sn-p,其中添加了 truncate()。

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() 方法而不会出错?

【问题讨论】:

  • W3C truncate spec 享受。
  • 为什么要截断(1)?为什么不 truncate(0) 得到一个零大小的文件?

标签: javascript html truncate filewriter


【解决方案1】:

这样的事情可能更重要一点:

截断将文件的长度更改为指定的长度

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

【讨论】:

    【解决方案2】:

    你需要更加异步。 :)

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

    【讨论】:

    • 我可能是错的,但我相信这会导致无限递归,因为你一直在触发 onwriteend。因此,您可能需要从其中取消 onwriteend。
    • 好收获。在我编写的代码中,我一直想替换 onwriteend 以建立后续代码。我正在重写原始代码以使用异步截断,但我没有考虑替换/取消 onwriteend 函数。
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 2017-07-16
    • 2020-12-28
    • 1970-01-01
    • 2013-06-09
    • 2017-11-11
    • 2014-05-13
    相关资源
    最近更新 更多