Я пишу приложение Android с Phonegap 1.4.1 и Sencha, которое загружает и читает pdf файлы. Как проверить, существует ли файл в телефонной книге с помощью методов phonegap, javascript или ajax?
Как проверить существование файла в телефонной книге с телефонной связью
Ответ 1
Вы можете проверить, существует ли файл с помощью объекта 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);
Ответ 2
У меня была та же проблема. Я не мог заставить Даркайко ответить на работу, но с ответом Курта я мог бы заставить его работать.
Здесь мой код:
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");
Ответ 3
Я получаю дескриптор файла с помощью метода .getFile('fileName',{create:false},success,failure)
. Если я получаю обратный вызов success
, файл есть, в противном случае любой сбой подразумевает, что есть проблема с файлом.
Ответ 4
Вышеуказанные ответы не помогли мне, но это произошло:
window.resolveLocalFileSystemURL(fullFilePath, success, fail);
Ответ 5
Ответы 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');
}
});
Ответ 6
@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
Ответ 7
Курт и Томас дали лучшие ответы, потому что функция Darkaico не только проверяет, существует ли файл, но также открывает файл и читает его до конца.
Это не проблема с небольшими файлами, но если вы проверите большой файл, приложение может потерпеть крах.
В любом случае, используйте метод .getFile - это лучший вариант.
Ответ 8
Я тестировал следующий фрагмент кода и отлично работал у меня в 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())
{}
Ответ 9
Проблема со всеми текущими ответами заключается в том, что они зависят от асинхронного обратного вызова, который обновляет глобальную переменную. Если вы проверяете несколько файлов, существует риск того, что переменная будет установлена с помощью другого обратного вызова.
Базовая проверка 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;
}
Ответ 10
Примечание:
когда я получаю файловую систему, я сохраняю ее в 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
}
Ответ 11
Этот код может использоваться для пользовательских случаев, полная документация здесь: загрузить, если не существует
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!";
}
Ответ 12
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
}
Ответ 13
Я принял @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) ;
Коррекция.... это НЕ работает. Теперь я работаю над исправлением.
Ответ 14
Если вам нужен логически-совместимый метод...
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;
}