Подтвердить что ты не робот

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

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

Я впервые попробовал это:

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

4b9b3361

Ответ 1

Вот правильный код, который не будет тратить 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);

Ответ 2

Вы можете обрезать, а затем записать два разных объекта 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);

Ответ 3

Обходной путь - это следующий код:

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

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

Ответ 4

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

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

Ответ 5

Это самый простой способ использования содержимого файла 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);

});