org.apache.cordova.file-extras plugin
=====================================

This plugin grants a Cordova application access to several additional filesystem roots, and provides a cross-platform means of accessing these filesystems based on their intended purpose.

The set of available filesystems depends on the platform.

Android
-------

    - files: The application's internal file storage directory
    - files-external: The application's external file storage directory
    - sdcard: The global external file storage directory (this is the root of the SD card, if one is installed)
    - cache: The application's internal cache directory
    - cache-external: The application's external cache directory
    - root: The entire device filesystem

Android also supports a special filesystem named "documents", which represents a "/Documents/" subdirectory within the "files" filesystem.

iOS
---

    - library: The application's Library directory
    - documents: The application's Documents directory
    - cache: The application's Cache directory
    - app-bundle: The application's bundle; the location of the app itself on disk
    - root: The entire device filesystem

By default, the library and documents directories can be synced to iCloud. You can also request two additional filesystems, "library-nosync" and "documents-nosync", which represent a special non-synced directory within the Library or Documents filesystem.

Configuring the plugin
----------------------

The set of available filesystems can be configured at build time per-platform. Both iOS and Android recognize a <preference> tag in `config.xml` which names the filesystems to be installed. The defaults for these preferences, if not set, are

    <preference name="iosExtraFilesystems" value="library,library-nosync,documents,documents-nosync,cache,bundle" />

    <preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external" />

These defaults contain all available filesystems except for "root".

Accessing the filesystems
-------------------------

The simplest method of using these new filesystems is to call `cordova.plugins.fileextras.getFilesystem` with the name of the filesystem you want to use.

    cordova.plugins.fileextras.getFilesystemRoot(filesystemName, successCallback, errorCallback);

If successful, `successCallback` will be called with a `DirectoryEntry` object representing the root of the filesystem. Otherwise, `errorCallback` will be called with a `FileError`.

It is also possible to request a `DirectoryEntry` object for a particular purpose. This provides a cross-platform way of accessing the various filesystem locations.

    cordova.plugins.fileextras.getDirectoryForPurpose(purpose, options, successCallback, failureCallback)

will call successCallback with a `DirectoryEntry` object suitable for the specified purpose.

The following string constants are defined for the `purpose` field:

    data
    documents
    cache
    temp        (returns the TEMPORARY filesystem)
    app-bundle  (iOS only)

The `options` field is an object. On iOS, it is possible to set it to `{syncable: false}` to obtain the non-synced versions of `data` or `documents`. On Android, you can set `{sandboxed: false}` to get the external (not confined to your app) versions of `data`, `documents` or `cache`.
