перезаписать файл с помощью HTML5 FileWriter

Я использую HTML5 FileWriter API для сохранения состояние моего веб-приложения. У меня есть немного JS, который периодически вызывает FileWriter.write для этого (поэтому со временем метод write вызывается несколько раз). По умолчанию API FileWriter использует подход «добавления» к записи файлов, который не соответствует моим потребностям, поскольку я не хочу перезаписывать содержимое файла.

Я сначала попробовал это:

this._writer.seek(0);
this._writer.write(content);

Это не работает, когда вы пишете текст короче, чем содержимое файла. Затем я попробовал это:

this._writer.truncate(0);
this._writer.write(content);

Этот код должен очистить файл, а затем записать мой новый контент, но я получаю следующую ошибку при вызове метода write:

Uncaught InvalidStateError: An operation that depends on state cached in an interface object was made but the state had changed since it was read from disk.

Странно: когда я отлаживаю код (с точкой останова), ошибка не возникает, как будто FileWriter.truncate был асинхронным методом...

Я застрял здесь, есть идеи?

Я использую Chrome 30.0.1599.69.


person htulipe    schedule 17.10.2013    source источник


Ответы (5)


Вот правильный код, который не будет тратить 500 мс на ожидание

fileWriter.onwriteend = function() {
    if (fileWriter.length === 0) {
        //fileWriter has been reset, write file
        fileWriter.write(blob);
    } else {
        //file has been overwritten with blob
        //use callback or resolve promise
    }
};
fileWriter.truncate(0);
person Ivan Nikitin    schedule 05.12.2013
comment
Не могли бы вы уточнить? Что такое д? - person htulipe; 06.12.2013
comment
@htulipe, это мой объект jQuery.Deffered, который я использую извне, чтобы получать уведомления, когда выполняются и усечение, и запись. Вы можете проигнорировать его или добавить любой другой код, который вы хотите выполнить, когда запись будет завершена. - person Ivan Nikitin; 09.12.2013
comment
@htulipe, пожалуйста, отметьте это как ответ, если это решит проблему. - person Ivan Nikitin; 23.02.2015
comment
обнаружен бесконечный цикл - person ColacX; 03.08.2017

Вы можете усечь, а затем написать двумя разными объектами FileWriter.

fileEntry.createWriter(function (fileWriter) {

        fileWriter.truncate(0);

    }, errorHandler);

fileEntry.createWriter(function (fileWriter) {

        var blob = new Blob(["New text"], { type: 'text/plain' });

        fileWriter.write(blob);

    }, errorHandler);
person okh    schedule 14.11.2015

Если вы хотите всегда переопределять его, вы можете использовать этот метод

function save(path,data){
    window.resolveLocalFileSystemURL(dataDirectory, function(dir){
        dir.getFile(path, {create:true}, function(file){
            file.createWriter(function(fileWriter){
                fileWriter.seek(0);
                fileWriter.truncate(0);
                var blob = new Blob([data], {type:'text/plain'});
                fileWriter.write(blob);
            }, function(e){
                console.log(e);
            });
        });
    });
};
person user1698821    schedule 16.03.2016

Обходным решением является следующий код:

this._writer.truncate(0);
window.setTimeout(function(){
    this._writer.write(content);
}.bind(this),500)

Это просто подождите 500 миллисекунд перед записью. Не супер, но работает...

person htulipe    schedule 17.10.2013

Это самый простой способ удаления содержимого файла с помощью syncFileSystem в моем приложении Chrome.

Два createWriter, первый усекает, а второй ничего не перезаписывает (вы можете изменить свое новое значение):

file.createWriter((fileWriter)=>fileWriter.truncate(0));

file.createWriter((fileWriter)=> {

  fileWriter.onwriteend = function() {
    console.log('New Actions!');
  };

  var blob = new Blob([''], {type: 'text/plain'});
  fileWriter.write(blob);

});
person Alexandre Lorret    schedule 22.06.2017