2011-07-22 47 views
9

Tôi đang thử nghiệm API API của HTML5 và tôi cần sử dụng một phương pháp mà tôi không biết đủ (chỉ đơn giản vì nó hầu như không được ghi lại ở bất kỳ đâu).Sử dụng phương pháp HTML5 FileWriter truncate()?

Tôi đang nói về phương thức FileWriter truncate() và tôi biết nó cần làm những gì tôi cần làm. Về cơ bản, thay vì thêm văn bản vào một số dữ liệu tệp hoặc sử dụng seek() để ghi đè lên một phần nhất định, tôi muốn ghi đè tất cả dữ liệu bằng dữ liệu khác (ví dụ: từ "somedata" tới "").

Dưới đây là một đoạn của việc thiết lập FileWriter từ HTML5Rocks, với truncate() được thêm vào trong.

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

Khi nó được để gọi writer.truncate(), gọi writer.write() ném một ngoại lệ File error . Tôi tin rằng điều này là do readyState được đặt thành WRITING. Thật không may, tôi không biết làm thế nào để có được xung quanh đó.

Tôi đã thử xem qua HTML5Rocks section về điều này, nhưng nó không cho tôi biết bất kỳ điều gì về phương thức cắt ngắn() mặc dù tôi biết nó tồn tại từ những gì mà Bảng điều khiển JS của Webkit nói với tôi).

Ngắn câu chuyện ngắn, cách tôi có thể sử dụng phương thức cắt ngắn() một cách chính xác mà không gặp lỗi?

+2

[W3C truncate spec] (http://www.w3.org/TR/file-writer-api/#widl-FileWriter-truncate) tận hưởng. – Raynos

+0

Tại sao cắt ngắn (1)? Tại sao không cắt bớt (0) để có được một tập tin có kích thước bằng không? – huyz

Trả lời

6

Bạn cần phải đồng bộ hơn. :)

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

Tôi có thể sai, nhưng tôi tin rằng điều này sẽ gây ra đệ quy vô hạn vì bạn liên tục kích hoạt tính năng ghi đè. Vì vậy, bạn có thể cần phải vô hiệu hóa onwriteend từ bên trong nó. – huyz

+0

Bắt tốt. Trong mã tôi đã viết, tôi đã luôn luôn muốn thay thế onwriteend anyway để thiết lập mã followup. Tôi đã viết lại mã ban đầu để sử dụng truncate không đồng bộ, nhưng tôi không nghĩ về việc thay thế/vô hiệu hóa hàm onwriteend. –

11

Something như thế này có thể là nhiều hơn một chút vào vấn đề:

truncate Thay đổi độ dài của tập tin với định

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); 
Các vấn đề liên quan