Comment vérifier l'existence d'un fichier dans l'annuaire téléphonique avec le partage de téléphone

J'écris une application Android avec Phonegap 1.4.1 et Sencha qui télécharge et lit des fichiers pdf. Comment puis-je vérifier si le fichier existe dans le répertoire téléphonique en utilisant des méthodes de messagerie vocale, javascript ou ajax?

  • Obtiens des enfants ListView qui ne sont pas en vue
  • Des problèmes connus sur différents appareils Android?
  • Écran d'appel entrant Android
  • Est-il possible d'utiliser VectorDrawable dans les boutons et les TextViews en utilisant android: DrawableRight?
  • Comment obtenir l'IMEI / ESN de l'appareil par programme dans Android?
  • Comment ajouter la catégorie sur l'en-tête de préférence?
  • Les requêtes Ajax échouent après la mise à niveau vers Cordova 5.0 + cordova-android@4.0
  • Ajax post ne fonctionne pas - Jquery Phonegap Android
  • La fonction ajax de jQuery ne fonctionne pas dans l'application Android PhoneGap
  • Android: intercepte l'appel AJAX depuis WebView
  • Les cookies de session Cordova ne fonctionnent pas sur Android Lollipop
  • Phonegap Cross-domain AJAX POST Demande ne fonctionne pas sur Android
  • 14 Solutions collect form web for “Comment vérifier l'existence d'un fichier dans l'annuaire téléphonique avec le partage de téléphone”

    Vous pouvez vérifier si le fichier existe en utilisant l'objet FileReader à partir de phonegap. Vous pouvez vérifier les points 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); 

    J'ai eu le même problème. Je ne pouvais pas obtenir la réponse de Darkaico au travail, mais avec la réponse de Kurt, je pourrais 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"); 

    Je reçois une touche pour le fichier en utilisant la .getFile('fileName',{create:false},success,failure) . Si je reçois le rappel de success le fichier est là, sinon tout échec implique qu'il y a un problème avec le fichier.

    Les réponses ci-dessus ne fonctionnaient pas pour moi, mais ceci:

     window.resolveLocalFileSystemURL(fullFilePath, success, fail); 

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

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

    @PassKit est correct, dans mon cas, j'ai dû ajouter un eventlistener

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

    Alors 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 } 

    Le fichier varSystemRoot dans IOS me renvoie "cdvfile: // localhost / persistent /" et les fichiers ont été stockés dans "// var / mobile / Containers / Data / Application / {AppID} / Documents"

    Merci beaucoup à @PassKit, ce mode en mode synchrone et a été testé dans IOS 8.1

    Kurt et Thomas ont donné de meilleures réponses, car la fonction de Darkaico vérifie non seulement si le fichier existe mais ouvre également le fichier 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 risque de se bloquer.

    Quoi qu'il en soit, utilisez la méthode .getFile – c'est la meilleure option.

    J'ai testé l'extrait de code suivant, et ça me 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()) {} 

    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 basique Javascript XMLHttpRequest est parfaite pour vérifier de façon 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); } 

    Passez simplement le chemin complet vers le fichier, puis vous pouvez utiliser de manière fiable:

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

    Pour stocker le chemin d'accès 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; } 

    Remarque:

    Lorsque 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 } 

    Ce code peut être utilisé pour les cas personnalisés, documentation complète ici: téléchargement 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!"; } 
      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; } 

    Maintenant vous pouvez utiliser les conditions

     if(fileexist=="true"){ //do something; } else if(fileexist=="false"){ //do something else } 

    J'ai pris @Thomas Soti réponse ci-dessus et l'a réduit à une simple réponse oui / non.

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

    Correction … cela ne fonctionne PAS. Je travaille actuellement sur le correctif.

    Si vous avez besoin d'une méthode booléenne compatible …

     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; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.