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
になります。