ここのことはなかったことにするかもしれない

仕事がらみの記事を主として扱いますが、あくまで個人ブログです。2013年以前の記事は https://yellow-73.hatenablog.com/ にあります。

Cordova/Android でファイル操作

cordova-plugin-file

https://github.com/apache/cordova-plugin-file

プロジェクトを作る

cordova create (ディレクトリ名) (ネームスペース) (タイトル)
cd (ディレクトリ名)
cordova platform add android
cordova plugin add cordova-plugin-file

クラス作成例

たとえば、次のようなクラスを作りました。

function TextFileSystem(dirPath) {
  this.dirPath = dirPath
};

TextFileSystem.prototype.readFile = function readFile(fileName, success, fail) {
    window.resolveLocalFileSystemURL(
        this.dirPath+fileName,
        function(fileEntry) {
            fileEntry.file(
                function(file) {
                    var reader = new FileReader();
                    reader.onloadend = function() {
                        success(this.result);
                    };
                    reader.readAsText(file);
                },
                fail
            );
        },
        fail
    );
};

TextFileSystem.prototype.createFile = function createFile(fileName, data, success, fail) {
    window.resolveLocalFileSystemURL(
        this.dirPath,
        function(fileSystem) {
            // ファイルを生成する、または上書きオープンする
            fileSystem.getFile(
                fileName,
                {
                    exclusive: false,
                    create: true,
                },
                function(fileEntry) {
                    // 作成できたので書き込む
                    fileEntry.createWriter(
                        function(writer) {
                            writer.write(data);
                            success();
                        },
                        fail
                    );
                },
                fail
            );
        },
        fail
    );
};

TextFileSystem.prototype.removeFile = function writeFile(fileName, success, fail) {
    // fetches filesystem.
    window.resolveLocalFileSystemURL(
        this.dirPath,
        function(fileSystem) {
            fileSystem.getFile(
                fileName,
                {
                    exclusive: false,
                    create: false,
                },
                function(fileEntry) {
                    fileEntry.remove();
                    success();
                },
                fail
            );
        },
        fail
    );
};

resolveLocalFileSystemURLは都度実行しています

resolveLocalFileSystemURL() を都度実行していますが、正直いいのか悪いのかわかりません。Dalvik側の onPause(), onResume() とかとの関係で、勝手にインスタンスが潰されると困るな、と。

failコールバック

fail のコールバックは一つのパラメータを取ります。chrome では error パラメータのオブジェクトは code のみからなります。

function (error) {
    console.log(error.code); // 数字だけ出る
}

エラーコードは https://developer.mozilla.org/en-US/docs/Web/API/FileError あたり参照。

cordova.file.* の中身 on Android

applicationDirectory: "file:///android_asset/"
applicationStorageDirectory: "file:///data/user/0/(ネームスペース)/"
cacheDirectory: "file:///data/user/0/j(ネームスペース)/cache/"
dataDirectory: "file:///data/user/0/(ネームスペース)/files/"
documentsDirectory: null
externalApplicationStorageDirectory: "file:///storage/emulated/0/Android/data/(ネームスペース)/"
externalCacheDirectory: "file:///storage/emulated/0/Android/data/j(ネームスペース)/cache/"
externalDataDirectory: "file:///storage/emulated/0/Android/data/(ネームスペース)/files/"
externalRootDirectory: "file:///storage/emulated/0/"
sharedDirectory: null
syncedDataDirectory: null
tempDirectory: null

nullが出ているので注意が必要です。

また、iOSとは値が違ってくるのだろうと思います。

パソコンとつなげるなら for Windows

externalDataDirectory(file:///storage/emulated/0/Android/data/(ネームスペース)/files/)は、Windowsでは

(デバイス)\内部共有ストレージ\Android\data\(ネームスペース)\files

になります。