Перезаписать файл с помощью 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
Ответы
Ответ 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);
});