cordova-promise-fs
Wraps the Cordova (and Chrome) File API in convenient functions (that return a Promise)
Are you entangled in a async callback mess to get even the simplest task done? Wait no longer -- here is cordova-promise-fs!
Getting started
bower install cordova-promise-fs
bower install bluebird
npm install cordova-promise-fs
npm install bluebird
cordova platform add ios@3.7.0
cordova plugin add org.apache.cordova.file
cordova plugin add org.apache.cordova.file-transfer
IMPORTANT: For iOS, use Cordova 3.7.0 or higher (due to a bug that affects requestFileSystem).
Or just download and include CordovaPromiseFS.js.
Usage
Initialize & configuration
var fs = CordovaPromiseFS({
persistent: true,
storageSize: 20*1024*1024,
concurrency: 3
Promise: require('promiscuous')
});
The Promise option expects a Promise library that follows the Promise/A+ spec, such as bluebird (github, download), promiscuous (github,file) or Angular's $q.
Note on concurrency: Concurrent uploads/downloads completely trash your mobile application. That's why I've put a concurrency limit on the number of downloads/uploads. Meteor sets this number on 30. In my experimental testing, I found 3 much more reasonable.
Browsing files
fs.exists(filename)
fs.file(filename)
fs.dir(path)
fs.list(path,optionString)
optionString = 'r'
optionString = 'd'
optionString = 'f'
optionString = 'e'
optionString = 'rfe'
Reading files
fs.read(filename)
fs.readJSON(filename)
fs.toUrl(filename)
fs.toInternalURL(filename)
fs.toDataURL(filename)
Writing files
fs.write(filename,data)
File operations
fs.create(filename)
fs.ensure(path)
fs.move(src,dest)
fs.copy(src,dest)
fs.remove(src)
fs.remove(src,true)
fs.removeDir(path)
Upload and download
FileTransfers with automatric retry and concurrency limit!
var promise = fs.upload(source,destination,[options],[onprogress]);
var promise = fs.upload(source,destination,[onprogress]);
var promise = fs.download(source,destination,[options],[onprogress]);
var promise = fs.download(source,destination,[onprogress]);
options.trustAllHosts
options.retry = [1000,2000,3000]
promise.progress(function(progressEvent){...})
promise.abort();
fs.upload(...).then(...)
Utilities
fs.fs
fs.filename(path)
fs.dirname(path)
fs.deviceready
fs.options
fs.isCordova
Normalized path
In CordovaPromiseFS, all filenames and paths are normalized:
- Directories should end with a
/
. - Filenames and directories should never start with a
/
. "./"
is converted to ""
This allows you to concatenate normalized paths, i.e.
normalize('dir1/dir2') === normalize('dir1') + normalize('dir2') === 'dir1/dir2/';
If you're storing or saving paths, it is recommended to normalize
them first to avoid comparison problems. (i.e. paths are not recognized as the same because of a missing trailing slash).
Beware: the original entry.fullPath
might return a path which starts with a /
. This causes problems on Android, i.e.
var path = filesystem.root.fullPath;
filesystem.root.getDirectory(path);
This problem is solved in CordovaPromiseFS.
Changelog
0.9.0 (28/11/2014)
- Normalize path everywhere.
0.8.0 (27/11/2014)
- Added test-suite, fixed few minor bugs.
0.7.0 (14/11/2014)
- bugfix toInternalURL functions and fix download argument order
0.6.0 (13/11/2014)
0.5.0 (06/11/2014)
- Use
webpack
for the build proces - Fixed many small bugs
0.4.0 (06/11/2014)
- Various small changes
- Added
CordovaPromiseFS.js
for everybody who does not use Browserify/Webpack
0.3.0 (05/11/2014)
- Added
list
options (list r
ecursively, only f
iles, only d
irectories, return result as e
ntries)
0.2.0 (05/11/2014)
- Added
upload
and download
methods with concurrency limit
Contribute
Convert CommonJS to a browser-version:
npm install webpack -g
npm run-script prepublish
Run tests: Navigate to /test/index.html
, for example:
npm install static -g
static .
Feel free to contribute to this project in any way. The easiest way to support this project is by giving it a star.
Contact
© 2014 - Mark Marijnissen