Как проверить существование файла в телефонном справочнике с телефонной связью

Я пишу приложение Android с Phonegap 1.4.1 и Sencha, которое загружает и читает pdf-файлы. Как проверить, существует ли файл в телефонной книге с помощью методов phonegap, javascript или ajax?

Solutions Collecting From Web of "Как проверить существование файла в телефонном справочнике с телефонной связью"

Вы можете проверить, существует ли файл с помощью объекта FileReader из телефонной заставки. Вы можете проверить следующее:

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

У меня такая же проблема. Я не мог получить ответ Даркейко на работу, но с ответом Курта я мог бы заставить его работать.

Вот мой код:

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

Тогда вам нужно выполнить только так:

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

Я получаю дескриптор файла, используя метод .getFile('fileName',{create:false},success,failure) . Если я получаю обратный вызов success файл есть, иначе любой сбой подразумевает, что есть проблема с файлом.

Вышеуказанные ответы не помогли мне, но это произошло:

 window.resolveLocalFileSystemURL(fullFilePath, success, fail); 

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

Ответы Darkaico, Kurt и thomas не помогли мне. Вот что сработало для меня.

 $.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 верен, в моем случае мне нужно было добавить eventlistener

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

То для значения «fileSystemRoot» в funtion «fsSuccess»

 var fileSystemRoot; // Global variable to hold filesystem root function fsSuccess(fileSystem) { fileSystemRoot = fileSystem.root.toURL(); } 

Функция "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 } 

Для проверки наличия файла

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

Var fileSystemRoot в IOS возвращает мне «cdvfile: // localhost / persistent /», а файлы хранятся в «// var / mobile / Containers / Data / Application / {AppID} / Documents"

Большое спасибо @PassKit, этот запуск в синхронном режиме и был протестирован в IOS 8.1

Курт и Томас дали лучшие ответы, потому что функция Даркайко не только проверяет, существует ли файл, но также открывает файл и читает его до конца.

Это не проблема с небольшими файлами, но если вы проверите большой файл, приложение может потерпеть крах.

В любом случае, пожалуйста, используйте метод .getFile – это лучший вариант.

Я протестировал следующий фрагмент кода и отлично поработал для меня в 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()) {} 

Проблема со всеми текущими ответами заключается в том, что они зависят от асинхронного обратного вызова, который обновляет глобальную переменную. Если вы проверяете несколько файлов, существует риск того, что переменная будет установлена ​​с помощью другого обратного вызова.

Основная проверка XMLHttpRequest Javascript идеально подходит для синхронной проверки файла, доступного через Javascript.

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

Просто передайте полный путь к файлу, а затем вы можете надежно использовать:

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

Чтобы сохранить корневой путь в переменной, вы можете использовать:

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

заметка:

Когда я получаю файловую систему, я сохраняю ее в var под объектом макроса 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); 

Поэтому мой код довольно прост …

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

Этот код можно использовать для пользовательских случаев, полная документация здесь: загрузить, если не существует

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

Теперь вы можете использовать условия

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

Я взял @Thomas Soti ответ выше и подрезал его до простого ответа «да / нет».

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

Коррекция …. это НЕ работает. Сейчас я работаю над исправлением.

Если вам нужен логически-совместимый метод …

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