2011-07-22 18 views
9

Estoy experimentando con la API de archivos HTML5, y necesito usar un método que no conozco bastante (simplemente porque casi no está documentado en ninguna parte).Usando el método HTML5 FileWriter truncate()?

Estoy hablando del método FileWriter truncate(), y sé que hace lo que tengo que hacer. Básicamente, en lugar de agregar texto a algunos datos de archivos o usar seek() para sobrescribir una cierta parte, quiero sobrescribir todos los datos con otra cosa (por ejemplo, desde "somedata" hasta "").

He aquí un fragmento de la configuración de FileWriter HTML5Rocks, con truncado() añade en.

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

Cuando se llega a llamar writer.truncate(), llamando writer.write() genera un error de excepción Archivo . Creo que esto se debe a que readyState está configurado para ESCRIBIR. Lamentablemente, no sé cómo evitarlo.

Ya he intentado buscar HTML5Rocks section en esto, pero no me dice nada acerca de un método truncate() (aunque sé que existe a partir de lo que me dice la consola Webkit JS).

En resumen, ¿cómo puedo usar el método truncate() correctamente sin obtener un error?

+2

[truncado W3C spec] (http://www.w3.org/TR/file-writer-api/#widl-FileWriter-truncate) disfruta. – Raynos

+0

¿Por qué truncar (1)? ¿Por qué no truncar (0) para obtener un archivo de tamaño cero? – huyz

Respuesta

6

Necesita ser más asíncrono. :)

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

Podría estar equivocado, pero creo que esto causará una recursión infinita ya que constantemente está activando onwriteend. Por lo tanto, es posible que deba anular el escrito desde dentro. – huyz

+0

Buena captura. En el código que he escrito, siempre he querido reemplazar onwriteend de todos modos para establecer el código de seguimiento. Estaba reescribiendo el código original para usar el truncado asíncrono, pero no pensé en reemplazar/anular la función onwriteend. –

11

Algo como esto podría ser un poco más al punto:

truncado cambia la longitud del archivo al que se especifica

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