// install : cordova plugin add cordova-plugin-file // link : https://github.com/apache/cordova-plugin-file angular.module('ngCordova.plugins.file', []) .constant('$cordovaFileError', { 1: 'NOT_FOUND_ERR', 2: 'SECURITY_ERR', 3: 'ABORT_ERR', 4: 'NOT_READABLE_ERR', 5: 'ENCODING_ERR', 6: 'NO_MODIFICATION_ALLOWED_ERR', 7: 'INVALID_STATE_ERR', 8: 'SYNTAX_ERR', 9: 'INVALID_MODIFICATION_ERR', 10: 'QUOTA_EXCEEDED_ERR', 11: 'TYPE_MISMATCH_ERR', 12: 'PATH_EXISTS_ERR' }) .provider('$cordovaFile', [function () { this.$get = ['$q', '$window', '$cordovaFileError', function ($q, $window, $cordovaFileError) { return { getFreeDiskSpace: function () { var q = $q.defer(); cordova.exec(function (result) { q.resolve(result); }, function (error) { q.reject(error); }, 'File', 'getFreeDiskSpace', []); return q.promise; }, checkDir: function (path, dir) { var q = $q.defer(); if ((/^\//.test(dir))) { q.reject('directory cannot start with \/'); } try { var directory = path + dir; $window.resolveLocalFileSystemURL(directory, function (fileSystem) { if (fileSystem.isDirectory === true) { q.resolve(fileSystem); } else { q.reject({code: 13, message: 'input is not a directory'}); } }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); } catch (err) { err.message = $cordovaFileError[err.code]; q.reject(err); } return q.promise; }, checkFile: function (path, file) { var q = $q.defer(); if ((/^\//.test(file))) { q.reject('directory cannot start with \/'); } try { var directory = path + file; $window.resolveLocalFileSystemURL(directory, function (fileSystem) { if (fileSystem.isFile === true) { q.resolve(fileSystem); } else { q.reject({code: 13, message: 'input is not a file'}); } }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); } catch (err) { err.message = $cordovaFileError[err.code]; q.reject(err); } return q.promise; }, createDir: function (path, dirName, replaceBool) { var q = $q.defer(); if ((/^\//.test(dirName))) { q.reject('directory cannot start with \/'); } replaceBool = replaceBool ? false : true; var options = { create: true, exclusive: replaceBool }; try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getDirectory(dirName, options, function (result) { q.resolve(result); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, createFile: function (path, fileName, replaceBool) { var q = $q.defer(); if ((/^\//.test(fileName))) { q.reject('file-name cannot start with \/'); } replaceBool = replaceBool ? false : true; var options = { create: true, exclusive: replaceBool }; try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(fileName, options, function (result) { q.resolve(result); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, removeDir: function (path, dirName) { var q = $q.defer(); if ((/^\//.test(dirName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getDirectory(dirName, {create: false}, function (dirEntry) { dirEntry.remove(function () { q.resolve({success: true, fileRemoved: dirEntry}); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); }, function (er) { er.message = $cordovaFileError[er.code]; q.reject(er); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, removeFile: function (path, fileName) { var q = $q.defer(); if ((/^\//.test(fileName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(fileName, {create: false}, function (fileEntry) { fileEntry.remove(function () { q.resolve({success: true, fileRemoved: fileEntry}); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); }, function (er) { er.message = $cordovaFileError[er.code]; q.reject(er); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, removeRecursively: function (path, dirName) { var q = $q.defer(); if ((/^\//.test(dirName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getDirectory(dirName, {create: false}, function (dirEntry) { dirEntry.removeRecursively(function () { q.resolve({success: true, fileRemoved: dirEntry}); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); }, function (er) { er.message = $cordovaFileError[er.code]; q.reject(er); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, writeFile: function (path, fileName, text, replaceBool) { var q = $q.defer(); if ((/^\//.test(fileName))) { q.reject('file-name cannot start with \/'); } replaceBool = replaceBool ? false : true; var options = { create: true, exclusive: replaceBool }; try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(fileName, options, function (fileEntry) { fileEntry.createWriter(function (writer) { if (options.append === true) { writer.seek(writer.length); } if (options.truncate) { writer.truncate(options.truncate); } writer.onwriteend = function (evt) { if (this.error) { q.reject(this.error); } else { q.resolve(evt); } }; writer.write(text); q.promise.abort = function () { writer.abort(); }; }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, writeExistingFile: function (path, fileName, text) { var q = $q.defer(); if ((/^\//.test(fileName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(fileName, {create: false}, function (fileEntry) { fileEntry.createWriter(function (writer) { writer.seek(writer.length); writer.onwriteend = function (evt) { if (this.error) { q.reject(this.error); } else { q.resolve(evt); } }; writer.write(text); q.promise.abort = function () { writer.abort(); }; }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, readAsText: function (path, file) { var q = $q.defer(); if ((/^\//.test(file))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(file, {create: false}, function (fileEntry) { fileEntry.file(function (fileData) { var reader = new FileReader(); reader.onloadend = function (evt) { if (evt.target.result !== undefined || evt.target.result !== null) { q.resolve(evt.target.result); } else if (evt.target.error !== undefined || evt.target.error !== null) { q.reject(evt.target.error); } else { q.reject({code: null, message: 'READER_ONLOADEND_ERR'}); } }; reader.readAsText(fileData); }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, readAsDataURL: function (path, file) { var q = $q.defer(); if ((/^\//.test(file))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(file, {create: false}, function (fileEntry) { fileEntry.file(function (fileData) { var reader = new FileReader(); reader.onloadend = function (evt) { if (evt.target.result !== undefined || evt.target.result !== null) { q.resolve(evt.target.result); } else if (evt.target.error !== undefined || evt.target.error !== null) { q.reject(evt.target.error); } else { q.reject({code: null, message: 'READER_ONLOADEND_ERR'}); } }; reader.readAsDataURL(fileData); }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, readAsBinaryString: function (path, file) { var q = $q.defer(); if ((/^\//.test(file))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(file, {create: false}, function (fileEntry) { fileEntry.file(function (fileData) { var reader = new FileReader(); reader.onloadend = function (evt) { if (evt.target.result !== undefined || evt.target.result !== null) { q.resolve(evt.target.result); } else if (evt.target.error !== undefined || evt.target.error !== null) { q.reject(evt.target.error); } else { q.reject({code: null, message: 'READER_ONLOADEND_ERR'}); } }; reader.readAsBinaryString(fileData); }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, readAsArrayBuffer: function (path, file) { var q = $q.defer(); if ((/^\//.test(file))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(file, {create: false}, function (fileEntry) { fileEntry.file(function (fileData) { var reader = new FileReader(); reader.onloadend = function (evt) { if (evt.target.result !== undefined || evt.target.result !== null) { q.resolve(evt.target.result); } else if (evt.target.error !== undefined || evt.target.error !== null) { q.reject(evt.target.error); } else { q.reject({code: null, message: 'READER_ONLOADEND_ERR'}); } }; reader.readAsArrayBuffer(fileData); }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, moveFile: function (path, fileName, newPath, newFileName) { var q = $q.defer(); newFileName = newFileName || fileName; if ((/^\//.test(fileName)) || (/^\//.test(newFileName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(fileName, {create: false}, function (fileEntry) { $window.resolveLocalFileSystemURL(newPath, function (newFileEntry) { fileEntry.moveTo(newFileEntry, newFileName, function (result) { q.resolve(result); }, function (error) { q.reject(error); }); }, function (err) { q.reject(err); }); }, function (err) { q.reject(err); }); }, function (er) { q.reject(er); }); } catch (e) { q.reject(e); } return q.promise; }, moveDir: function (path, dirName, newPath, newDirName) { var q = $q.defer(); newDirName = newDirName || dirName; if (/^\//.test(dirName) || (/^\//.test(newDirName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getDirectory(dirName, {create: false}, function (dirEntry) { $window.resolveLocalFileSystemURL(newPath, function (newDirEntry) { dirEntry.moveTo(newDirEntry, newDirName, function (result) { q.resolve(result); }, function (error) { q.reject(error); }); }, function (erro) { q.reject(erro); }); }, function (err) { q.reject(err); }); }, function (er) { q.reject(er); }); } catch (e) { q.reject(e); } return q.promise; }, copyDir: function (path, dirName, newPath, newDirName) { var q = $q.defer(); newDirName = newDirName || dirName; if (/^\//.test(dirName) || (/^\//.test(newDirName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getDirectory(dirName, {create: false, exclusive: false}, function (dirEntry) { $window.resolveLocalFileSystemURL(newPath, function (newDirEntry) { dirEntry.copyTo(newDirEntry, newDirName, function (result) { q.resolve(result); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (erro) { erro.message = $cordovaFileError[erro.code]; q.reject(erro); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); }, function (er) { er.message = $cordovaFileError[er.code]; q.reject(er); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, copyFile: function (path, fileName, newPath, newFileName) { var q = $q.defer(); newFileName = newFileName || fileName; if ((/^\//.test(fileName))) { q.reject('file-name cannot start with \/'); } try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getFile(fileName, {create: false, exclusive: false}, function (fileEntry) { $window.resolveLocalFileSystemURL(newPath, function (newFileEntry) { fileEntry.copyTo(newFileEntry, newFileName, function (result) { q.resolve(result); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (erro) { erro.message = $cordovaFileError[erro.code]; q.reject(erro); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); }, function (er) { er.message = $cordovaFileError[er.code]; q.reject(er); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, readFileMetadata: function (path, file) { var q = $q.defer(); if ((/^\//.test(file))) { q.reject('directory cannot start with \/'); } try { var directory = path + file; $window.resolveLocalFileSystemURL(directory, function (fileEntry) { fileEntry.file(function (result) { q.resolve(result); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; } /* listFiles: function (path, dir) { }, listDir: function (path, dirName) { var q = $q.defer(); try { $window.resolveLocalFileSystemURL(path, function (fileSystem) { fileSystem.getDirectory(dirName, options, function (parent) { var reader = parent.createReader(); reader.readEntries(function (entries) { q.resolve(entries); }, function () { q.reject('DIR_READ_ERROR : ' + path + dirName); }); }, function (error) { error.message = $cordovaFileError[error.code]; q.reject(error); }); }, function (err) { err.message = $cordovaFileError[err.code]; q.reject(err); }); } catch (e) { e.message = $cordovaFileError[e.code]; q.reject(e); } return q.promise; }, */ }; }]; }]);