2011-07-22 13 views
9

Eksperymentuję z interfejsem API HTML5 i potrzebuję metody, o której nie wiem wystarczająco dużo (po prostu dlatego, że nigdzie jej nie udokumentowano).Korzystanie z metody skracania pliku HTML5 FileWriter()?

Mówię o metodzie przycinania FileWriter() i wiem, że robi to, co muszę zrobić. Zasadniczo, zamiast dołączania tekstu do niektórych plików lub używania funkcji seek() w celu nadpisania określonej części, chcę nadpisać wszystkie dane czymś innym (np. Od "somedata" do "").

Oto fragment konfiguracji FileWriter od HTML5Rocks, ze skróconej() dodaje się.

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

Kiedy robi się wywołaniem writer.truncate(), nazywając writer.write() zgłasza błąd wyjątku pliku . Wierzę, że dzieje się tak dlatego, że parametr readyState jest ustawiony na PISANIE. Niestety, nie wiem, jak sobie z tym poradzić.

Próbowałem już przejrzeć HTML5Rocks section na ten temat, ale nie mówi mi nic o metodę truncate() (chociaż wiem, że istnieje z tego, co mówi mi konsola JS Webkit).

Krótka historia, jak mogę poprawnie użyć metody truncate() bez otrzymania błędu?

+2

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

+0

Po co przycinać (1)? Dlaczego nie skrócić (0), aby uzyskać plik o zerowym rozmiarze? – huyz

Odpowiedz

6

Musisz być bardziej asynchroniczny. :)

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

Mogę się mylić, ale wierzę, że spowoduje to nieskończoną rekurencję, ponieważ ciągle uruchamiasz inwriteend. Więc możesz potrzebować unieważnić onwriteend od wewnątrz. – huyz

+0

Dobry połów. W kodzie, który napisałem, zawsze chciałem zastąpić onwriteend w każdym razie, aby ustanowić kolejny kod. Zmieniłem oryginalny kod, aby użyć skrótu asynchronicznego, ale nie myślałem o zastąpieniu/nullifying funkcji onwriteend. –

11

Coś jak to może być trochę bardziej na miejscu:

truncate zmienia długość pliku do określonego

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); 
Powiązane problemy