全て、
Monaca Debugger でバグを発見した可能性があります。
次のコードを使用して、永続的または一時的なストレージを取得しています。
window.requestFileSystem(__storageType, _size,
function(_fileSystem) { // Success
logger.info("initFilesystem: _fileSystem.root: " + _fileSystem.root.toURL());
_deferred.resolve(_fileSystem);
}, function(_error) { // Failure
_deferred.reject(_error);
});
Android と iOS の両方でファイルが正しく管理されている場所。ただし、パスは Android と永続ストレージでは正しくありません。これは、Monaca デバッガーがコルドバ プラグインへのパスを与える方法のバグであると想定しています (Android へのデプロイとデバッガーなしでの検証はまだ試していないことに注意してください)。
Android と iOS で取得したパスについては、以下を参照してください。ここでは、Android のルート ディレクトリのみを取得して永続化します (すべての例で、ファイルは正しく管理されていることに注意してください。正しくないのは Android と永続化のパスのみです)。
これはバグですか、それともコードで管理する必要がある機能ですか?
永続的なファイル パス:
- iOS: _fileSystem.root: file:///var/mobile/Containers/Data/Application/43F2E2CE-5F06-43F0-AE1C-4DD35EFF723A/Documents/
- Android: _fileSystem.root: file:///storage/emulated/0/
一時ファイルのパス:
- iOS: _fileSystem.root: file:///var/mobile/Containers/Data/Application/43F2E2CE-5F06-43F0-AE1C-4DD35EFF723A/tmp/
- Android: _fileSystem.root: file:///storage/emulated/0/Android/data/mobi.monaca.debugger/cache/
バージョン:
- iOS バージョン: 8.1.2
- iOS Monaca デバッガー バージョン: 3.1.1
- Android バージョン: 4.2.2
- Android Monaca デバッガーのバージョン: 3.1.1
2015 年 2 月 4 日更新:
使用されるファイル オブジェクト (簡略化されたコード):
function FileIO() {
if (false === (this instanceof FileIO)) { return new FileIO(); } // Enforce that every time a constructor function is called, this function is invoked properly using the new operator.
/** @public @method initFilesystem.
* @desc Initialize filesystem
* @param {boolean} Persistent = true, Temporary = false. Must be boolean. Defaults to true.
* @param {size} Size in bytes requested. Must be number. Defaults to 0 bytes.
* @return Promise (see examples above). */
FileIO.prototype.initFilesystem = function(_persistent, _size) {
/** @private */ var _deferred = new jQuery.Deferred(); // Used for object Promise.
/** @private */ var _err = { code: null };
if (__status != STATUS_INITIALIZED) { // Only perform if not already initialized.
if (typeof _persistent !== 'boolean') { _persistent = true; } // Value must be boolean. Default to true if not set correctly.
if (typeof _size !== 'number') { _size = 0; } // Value must be number. Default to 0 bytes if not set correctly.
(_persistent == true) ? __storageType = window.PERSISTENT : __storageType = window.TEMPORARY;
__status = STATUS_INITIALIZING;
try {
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.storageInfo = window.storageInfo || window.webkitStorageInfo;
window.requestFileSystem(__storageType, _size,
function(_fileSystem) { // Success
__fileSystem = _fileSystem;
__status = STATUS_INITIALIZED;
_deferred.resolve(_fileSystem);
}, function(_error) { // Failure
__status = STATUS_NO_FILESYSTEM;
_deferred.reject(_error);
});
} catch (_error) {
__status = STATUS_NO_FILESYSTEM;
_deferred.reject(_error);
}
} else {
_err.code = FILESYSTEM_ALREADY_INITIALIZED;
_deferred.reject(_err);
}
return _deferred.promise();
};
/** @public @method createFile.
* @desc Create file.
* @param {string} (path/)filename. Must be string. Defaults to "file.txt".
* @return Promise (see examples above). */
FileIO.prototype.createFile = function(_fileName) {
/** @private */ var _err = { code: null };
/** @private */ var _deferred = new jQuery.Deferred(); // Used for object Promise.
if (typeof _fileName !== 'string') { _fileName = "file.txt"; } // Default to "file.txt" if not correct.
if (__status != STATUS_NO_FILESYSTEM) { // Object must be initialized.
try {
__fileSystem.root.getFile(_fileName, { create: true, exclusive: true },
function(_fileEntry) { // Success
_deferred.resolve(_fileEntry);
}, function(_error) { // Failure
_deferred.reject(_error);
});
} catch (_error) {
_deferred.reject(_error);
}
} else {
_err.code = FILESYSTEM_NOT_INITIALIZED;
_deferred.reject(_err);
}
return _deferred.promise();
};
/** @public @constructor init.
* @desc Constructor for the class.
* @param N/A.
* @return N/A. */
FileIO.prototype.init = function() {
};
// Construct
this.init();
}
初期化:
var appFileSystem = new FileIO();
appFileSystem.initFilesystem(true); // Persistent.
appFileSystem.createFile("testfile.txt").done(function(fileEntry) { console.log("createFile: done. fileEntry: "+JSON.stringify(fileEntry)); }).fail(function(error) { console.log("createFile: fail. error.code: "+error.code); });
上記により、FileIO オブジェクトが作成され、ファイルシステムが初期化され、ファイルが作成されます。永続ストレージはルートに配置され (最新の Monaca アップデートに従って Cordova 4 でテストおよび検証済み)、非永続ストレージは適切なディレクトリに配置されます。