Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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, файл есть, в противном случае любой сбой подразумевает, что есть проблема с файлом.

Ответ 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;
}