web-dev-qa-db-fra.com

Comment vérifier l'existence d'un fichier dans l'annuaire téléphonique avec phonegap

J'écris une application Android avec Phonegap 1.4.1 et Sencha qui télécharge et lit les fichiers PDF. Comment puis-je vérifier si le fichier existe dans le répertoire téléphonique à l'aide des méthodes phonegap, javascript ou ajax?

18
user992804

Vous pouvez vérifier si le fichier existe à l'aide de l'objet FileReader de phonegap . Vous pouvez vérifier les éléments suivants:

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);   
5
Darkaico

J'ai eu le même problème. Je n'arrivais pas à obtenir la réponse de Darkaico, mais avec la réponse de Kurt, je pouvais le faire fonctionner.

Voici mon code:

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);
}

Ensuite, il vous suffit d'exécuter comme ceci:

checkIfFileExists("path/to/my/file.txt");
32
Thomas Solti

Je reçois un traitement du fichier en utilisant la méthode .getFile('fileName',{create:false},success,failure). Si je reçois le callback success, le fichier est là, sinon tout échec implique un problème avec le fichier.

21
Kurt Schuster

Les réponses ci-dessus n'ont pas fonctionné pour moi, mais cela a:

window.resolveLocalFileSystemURL(fullFilePath, success, fail);

à partir de: http://www.raymondcamden.com/2014/07/01/Cordova-Sample-Check-for-a-file-and-download-if-it-is-isnt-there

20
kris

Les réponses de Darkaico, Kurt et thomas n'ont pas fonctionné pour moi. Voici ce qui a fonctionné pour moi.

$.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');
}
});
4
alexdabest

@PassKit est correct, dans mon cas je devais ajouter un eventlistener

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
       window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
       window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, fsSuccess, fsError);
}

puis pour la valeur "fileSystemRoot" dans la fonction "fsSuccess"

var fileSystemRoot; // Global variable to hold filesystem root

function fsSuccess(fileSystem) {
       fileSystemRoot = fileSystem.root.toURL();
}

la fonction "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
}

pour vérifier si le fichier existe

if (checkFileExists(fileSystemRoot + "fileName")) {
     // File Exists
} else {
     // File Does Not Exist
}

la var fileSystemRoot dans IOS me renvoie "cdvfile: // localhost/persistent /" et les fichiers étaient stockés dans "// var/mobile/Conteneurs/Données/Application/{AppID}/Documents"

Un grand merci à @PassKit, cela a fonctionné en mode synchrone et a été testé dans IOS 8.1

2
Víctor

J'ai testé l'extrait de code suivant et cela fonctionne très bien dans 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())
{}
1

Kurt et Thomas donnèrent de meilleures réponses, car la fonction de Darkaico non seulement vérifie si le fichier existe, mais l'ouvre également et le lit jusqu'à la fin.

Ce n'est pas un problème avec les petits fichiers, mais si vous vérifiez un fichier volumineux, l'application peut se bloquer.

Quoi qu’il en soit, veuillez utiliser la méthode .getFile - c’est la meilleure option.

1
Marek Marciniak

Ce code peut être utilisé pour des cas personnalisés, la documentation complète ici: télécharger s'il n'existe pas

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!";
}
0
justnajm

Le problème avec toutes les réponses actuelles est qu'elles dépendent d'un rappel asynchrone qui met à jour une variable globale. Si vous vérifiez plusieurs fichiers, il existe un risque que la variable ait été définie par un rappel différent.

Une vérification JavaScript de base XMLHttpRequest est parfaite pour vérifier de manière synchrone que le fichier est accessible via Javascript. 

function checkFileExists(fileName){

    var http = new XMLHttpRequest();
    http.open('HEAD', fileName, false);
    http.send(null);
    return (http.status != 404);
}

Il suffit de passer le chemin complet du fichier pour pouvoir utiliser de manière fiable:

if (checkFileExists(fullPathToFile)) {
    // File Exists
} else {
    // File Does Not Exist
}

Pour stocker le chemin racine dans une variable, vous pouvez utiliser:

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;
}   
0
PassKit

remarque:

quand je reçois le système de fichiers, je l’enregistre dans une var sous un objet macro 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);

donc mon code est assez simple ...

var fileExists = function(path, existsCallback, dontExistsCallback){
    pg.fs.fileSystem.root.getFile(path, { create: false }, existsCallback, dontExistsCallback);
        // "existsCallback" will get fileEntry as first param
    }
0
Gromish