javascript - notification - cordova-plugin-dialogs
Cómo verificar la existencia de un archivo en la guía telefónica con phonegap (14)
Puede verificar si el archivo existe utilizando el objeto FileReader desde phonegap. Puede verificar lo siguiente:
var reader = new FileReader();
var fileSource = <here is your file path>
reader.onloadend = function(evt) {
if(evt.target.result == null) {
// If you receive a null value the file doesn''t exists
} else {
// Otherwise the file exists
}
};
// We are going to check if the file exists
reader.readAsDataURL(fileSource);
Estoy escribiendo una aplicación de Android con Phonegap 1.4.1 y Sencha que descarga y lee archivos pdf. ¿Cómo puedo verificar si el archivo existe en el directorio telefónico utilizando los métodos de fajos de teléfono, javascript o ajax?
Yo tuve el mismo problema. No pude lograr que la respuesta de Darkaico funcionara, pero con la respuesta de Kurt podría hacerlo funcionar.
Aquí está mi código:
function checkIfFileExists(path){
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
fileSystem.root.getFile(path, { create: false }, fileExists, fileDoesNotExist);
}, getFSFail); //of requestFileSystem
}
function fileExists(fileEntry){
alert("File " + fileEntry.fullPath + " exists!");
}
function fileDoesNotExist(){
alert("file does not exist");
}
function getFSFail(evt) {
console.log(evt.target.error.code);
}
Entonces solo necesitas ejecutar de esta manera:
checkIfFileExists("path/to/my/file.txt");
Kurt y Thomas dieron mejores respuestas, porque la función de Darkaico no solo verifica si el archivo existe, sino que también abre el archivo y lo lee hasta el final.
Esto no es un problema con archivos pequeños, pero si comprueba un archivo grande, la aplicación puede bloquearse.
De todos modos, utilice el método .getFile: es la mejor opción.
Las respuestas de Darkaico, Kurt y Thomas no funcionaron para mí. Esto es lo que funcionó para mí.
$.ajax({
url:''file///sdcard/myfile.txt'',
type:''HEAD'',
error: function()
{
//file not exists
alert(''file does not exist'');
},
success: function()
{
//file exists
alert(''the file is here'');
}
});
Si necesita un método compatible con Boole ...
function checkIfFileExists(path){
var result = false;
window.requestFileSystem(
LocalFileSystem.PERSISTENT,
0,
function(fileSystem){
fileSystem.root.getFile(
path,
{ create: false },
function(){ result = true; }, // file exists
function(){ result = false; } // file does not exist
);
},
getFSFail
); //of requestFileSystem
return result;
}
Obtengo un control del archivo usando el .getFile(''fileName'',{create:false},success,failure)
. Si obtengo la devolución de llamada success
el archivo está ahí, de lo contrario, cualquier falla implica que hay un problema con el archivo.
El problema con todas las respuestas actuales es que dependen de una devolución de llamada asincrónica que actualiza una variable global. Si está revisando varios archivos, existe el riesgo de que la variable haya sido configurada por una devolución de llamada diferente.
Una comprobación básica de JavaScript XMLHttpRequest es perfecta para comprobar de forma síncrona que el archivo esté accesible a través de Javascript.
function checkFileExists(fileName){
var http = new XMLHttpRequest();
http.open(''HEAD'', fileName, false);
http.send(null);
return (http.status != 404);
}
Simplemente ingrese la ruta completa al archivo y luego puede usar de manera confiable:
if (checkFileExists(fullPathToFile)) {
// File Exists
} else {
// File Does Not Exist
}
Para almacenar la ruta raíz en una variable, puede usar:
var fileSystemRoot; // Global variable to hold filesystem root
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, fsSuccess, fsError);
function fsError() {
console.log("Failed to get Filesystem");
}
function fsSuccess(fileSystem) {
console.log("Got Filesystem: Root path " + fileSystem.root);
// save the file to global variable for later access
window.fileSystemRoot = fileSystem.root;
}
Probé el siguiente fragmento de código y me funciona bastante bien en PhoneGap 3.1
String.prototype.fileExists = function() {
filename = this.trim();
var response = jQuery.ajax({
url: filename,
type: ''HEAD'',
async: false
}).status;
return (response != "200") ? false : true;}
if (yourFileFullPath.fileExists())
{}
var fileexist;
function checkIfFileExists(path){
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
fileSystem.root.getFile(path, { create: false }, fileExists, fileDoesNotExist);
}, getFSFail); //of requestFileSystem
}
function fileExists(fileEntry){
alert("File " + fileEntry.fullPath + " exists!");
fileexist = true;
}
function fileDoesNotExist(){
alert("file does not exist");
fileexist = false;
}
function getFSFail(evt) {
console.log(evt.target.error.code);
fileexist=false;
}
ahora puedes usar condiciones
if(fileexist=="true"){
//do something;
}
else if(fileexist=="false"){
//do something else
}
Nota:
Cuando obtengo el sistema de archivos, lo guardo en una var debajo de un macro objeto pg:
pg = {fs:{}} // I have a "GOTFS" function... a "fail" function
pg.fs.filesystem = window.requestFileSystem(window.PERSISTENT, 0, pg.fs.GOTFS, pg.fs.fail);
entonces mi código es bastante simple ...
var fileExists = function(path, existsCallback, dontExistsCallback){
pg.fs.fileSystem.root.getFile(path, { create: false }, existsCallback, dontExistsCallback);
// "existsCallback" will get fileEntry as first param
}
@PassKit es correcto, en mi caso, necesitaba agregar un eventlistener
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, fsSuccess, fsError);
}
luego por el valor "fileSystemRoot" en la función "fsSuccess"
var fileSystemRoot; // Global variable to hold filesystem root
function fsSuccess(fileSystem) {
fileSystemRoot = fileSystem.root.toURL();
}
la función "checkFileExists"
function checkFileExists(fileName) {
var http = new XMLHttpRequest();
http.open(''HEAD'', fileName, false);
http.send(null);
if (http.status.toString() == "200") {
return true;
}
return false
}
para verificar si el archivo existe
if (checkFileExists(fileSystemRoot + "fileName")) {
// File Exists
} else {
// File Does Not Exist
}
el archivo varSystemRoot en IOS me devuelve "cdvfile: // localhost / persistent /" y los archivos se almacenan en "// var / mobile / Containers / Data / Application / {AppID} / Documents"
Muchas gracias a @PassKit, esta se ejecuta en modo sincrónico y se probó en IOS 8.1
Las respuestas anteriores no funcionaron para mí, pero esto hizo:
window.resolveLocalFileSystemURL(fullFilePath, success, fail);
desde: http://www.raymondcamden.com/2014/07/01/Cordova-Sample-Check-for-a-file-and-download-if-it-isnt-here
Tomé la respuesta @Thomas Soti arriba y reduje a una simple respuesta sí / no.
function fileExists(fileName) {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
fileSystem.root.getFile(cordova.file.dataDirectory + fileName, { create: false }, function(){return true}, function(){return false});
}, function(){return false}); //of requestFileSystem
}
// called as
if (fileExists("blah.json")) {
or
var fe = fileExists("blah.json) ;
Corrección ... esto NO funciona. Estoy trabajando en la solución ahora.
Este código se puede usar para casos personalizados, aquí encontrará documentación completa: descargar si no existe
document.addEventListener("deviceready", init, false);
//The directory to store data
var store;
//Used for status updates
var $status;
//URL of our asset
var assetURL = "https://raw.githubusercontent.com/cfjedimaster/Cordova-Examples/master/readme.md";
//File name of our important data file we didn''t ship with the app
var fileName = "mydatafile.txt";
function init() {
$status = document.querySelector("#status");
$status.innerHTML = "Checking for data file.";
store = cordova.file.dataDirectory;
//Check for the file.
window.resolveLocalFileSystemURL(store + fileName, appStart, downloadAsset);
}
function downloadAsset() {
var fileTransfer = new FileTransfer();
console.log("About to start transfer");
fileTransfer.download(assetURL, store + fileName,
function(entry) {
console.log("Success!");
appStart();
},
function(err) {
console.log("Error");
console.dir(err);
});
}
//I''m only called when the file exists or has been downloaded.
function appStart() {
$status.innerHTML = "App ready!";
}