Filer i Cordova

By . Latest revision .

Vi ska i denna artikel titta på hur vi kan skriva till fil och hur vi kan läsa från samma fil. Detta är en av de stora fördelar vi får med att använda Cordova för att komma åt hårdvarunära funktioner i våra mobila enheter.

I kursrepot finns ett exempel program i example/file och på Github under dbwebb-se/webapp.

Exempel programmet utgår från samma grundstruktur som i exemplet “Kom igång med Cordova”. Vi kommer i exempelprogrammet skapa ett textfält och sedan skriver vi det som finns i textfältet till fil. Vi kan sedan läsa tillbaka från filen och visa upp i appen.

#Plugin cordova-plugin-file

Vi börjar med att installera det plugin som behövs för att skriva till och läsa från filer i Cordova cordova-plugin-file med följande kommando, stå i ditt cordova projekt när du kör kommandot. Dokumentation och exempel för pluginen kan man hitta på Cordovas webbplats.

$ cordova plugin add cordova-plugin-file

I exempelprogrammet har jag en enkel vy som renderas efter att Cordova har sagt att den mobila enheter är redo med callbacken onDeviceReady. Vyn har ett text fält och tre knapper.

import m from "mithril";
import fileModel from "../models/filemodel.js";

var fileView = {
    oninit: fileModel.createFile,
    view: function() {
        return m("div.container", [
            m("h1", "Hello File"),
            m("input.input[type=text]", {
                oninput: function(e) {
                    fileModel.current = e.target.value;
                },
                value: fileModel.current
            }),
            m("button.button", {
                onclick: function() {
                    fileModel.writeToFile(
                        fileModel.file,
                        fileModel.current,
                        false
                    );
                }
            }, "Write text to file"),
            m("button.button", {
                onclick: function() {
                    fileModel.writeToFile(
                        fileModel.file,
                        fileModel.current,
                        true
                    );
                }
            }, "Append text to file"),
            m("button.button", {
                onclick: function() {
                    fileModel.readFromFile(fileModel.file);
                }
            }, "Read from file"),
            m("div.read-text", fileModel.readText)
        ]);
    }
};

export default fileView;

I oninit livscykel-metoden anropar vi funktionen fileModel.createFile, som skapar en så kallad ‘persistent file’. Hela modellen kan du hitta i exempelkatalogen. I createFile funktionen hämtar vi först det lokala filsystemet, som finns antigen i webbläsaren eller på den mobila enheten. Vi skapar sedan filen data.txt och sparar referensen till filen fileEntry i modellen.

createFile: function() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {
        console.log('file system open: ' + fs.name);
        fs.root.getFile(
            "data.txt",
            { create: true, exclusive: false },
            function (fileEntry) {
                fileModel.file = fileEntry;
            }, function() {
                outputError("Error loading file");
            });
    }, function() {
        outputError("Error loading filesystem");
    });
},

I vyn finns tre knappar som gör att vi kan skriva till filen, lägga till i filen och skriva ut från filen. De två knappar som skriver och läggar till i filen använder funktionen writeToFile. Här skapar vi först en fileWriter, som vi kan skriva till vår fileEntry med. Om vi vill lägga till flyttar vi oss först till slutet av filen och sedan skriver vi data, annars skriver vi data direkt. onwriteend och onerror är callback funktioner som anropas beroende på utfallet av skrivandet.

writeToFile: function(fileEntry, data, append) {
    fileEntry.createWriter(function (fileWriter) {
        fileWriter.onwriteend = function() {
            console.log("Successful file write...");
        };

        fileWriter.onerror = function (e) {
            console.log("Failed file write: " + e.toString());
        };

        if (append) {
            try {
                fileWriter.seek(fileWriter.length);
            } catch (e) {
                console.log("file doesn't exist!");
            }
        }

        if (data) {
            fileWriter.write(data);
        }
    });
},

Funktionen readFromFile öppnar vi först filen och skapar sedan en FileReader. Sedan definierar vi callback funktionen onloadend, där vi först sätter resultatet från från läsningen till variabeln fileModel.readText och använder sedan möjligheten till att rita om vår vy med m.redraw(). Variabeln visas redan i vyn, men nu får den ett innehåll och texten renderas.

readFromFile: function(fileEntry) {
    fileEntry.file(function (file) {
        var reader = new FileReader();

        reader.onloadend = function() {
            fileModel.readText = this.result;
            m.redraw();
        };

        reader.readAsText(file);
    }, function() {
        outputError("Error reading from file");
    });
}

#Avslutningsvis

Detta var en kort introduktion till hur filer fungerar i Cordova och hur vi kan skriva till och läsa från fil. I dokumentationen för pluginen finns fler exempel och information om hur det kan strula i vissa läge på de mobila enheterna.

#Revision history

  • 2020-04-22: (A, efo) Första utgåvan inför kursen webapp v3.

Document source.

Category: javascript.