Envoyé par : Raphael
Date : 08/04/2007 17:00
Bonjour, je voudrais pouvoir dézipper un fichier dans un répertoire donné mais je n'y parviens pas. J'ai adapté le Tutorial du site en vain. J'utilise XULRunner 1.9a3 sous Ubuntu.
Voici mon code :
function manualUpdateYCD() { var nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"] .createInstance(nsIFilePicker); fp.init(window, __("importycd.title"), nsIFilePicker.modeOpen); fp.appendFilter(__("importycd.filter"), "*.zip"); if (fp.show() == nsIFilePicker.returnOK) { updateYCD(fp.file); alert('Ok'); } } function updateYCD(zipFile) { // Répertoire de destination pour la décompression du .zip var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile); folder_databases.append("chrome"); folder_databases.append("content"); folder_databases.append("data"); folder_databases.append("databases"); chemin = folder_databases.path; // Ouverture du .zip var zip = Components.classes["@mozilla.org/libjar/zip-reader;1"].createInstance( Components.interfaces.nsIZipReader ); alert(zipFile.path); zip.init(zipFile); alert('test'); zip.open(); alert('test'); var it = zip.findEntries("*"); //patern pour recuperer le contenu de notre zip while (it.hasMoreElements()) { var entry = it.getNext(); entry = entry.QueryInterface(Components.interfaces.nsIZipEntry); var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile); folder_databases.initWithPath(chemin); entryChemin = entry.name.split('/'); alert('test'); for(i in entryChemin){ if(i==entryChemin.length-1 && entryChemin[i].length != 0){ folder_databases.append(entryChemin[i]); zip.extract ( entry.name , folder_databases ); break; } folder_databases.append(entryChemin[i]); try{folder_databases.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664);} catch(e){} } } zip.close(); }
Vous remarquerez que j'ai placé quelques alert() pour voir où bloque mon programme. Il va jusqu'à m'afficher le chemin de mon fichier "zip" dans ma fonction updateYCD(zipFile), mais mon alert() suivante ne s'affiche pas. Il semblerait donc que ce soit la ligne zip.init(zipFile); qui pose problème.
Mais je ne vois pas pourquoi il y a un problème... Quelqu'un saurait-il quelque chose sur le sujet ?
Merci d'avance.
Envoyé par : Paul Rouget
Date : 09/04/2007 18:06
Catch l'exception de ton init.
try { zip.init(zipFile); } catch(e) {alert(e)};
Envoyé par : Raphael
Date : 09/04/2007 18:30
J'ai un :
TypeError : zip.init is not a function
Pourtant, d'après XULPlanet, et le Tuto sur XULfr, ça devrait marcher non ?
Est-ce que ça pourrait venir de Ubuntu ? de XR 1.9a3 ? Ou pas du tout... ?
Envoyé par : thefab
Date : 09/04/2007 23:27
Je crois qui ZIPReader se trouve uniquement dans XULRunnre 1.8 et pas dans la 1.9...
alert(Components.interfaces.nsIZipReader);
Devrait le confirmer...
Envoyé par : Raphael
Date : 10/04/2007 09:42
Ca m'affiche :
nsIZipReader
Et s'il n'est pas dans 1.9, y-a-t-il une solution ? Ou bien suis-je condamner à vraiment repasser en 1.8 ? ET laquelle ? 1.8.0.4 ou 1.8.1.3 sachant que j'utilise SQLite3 actuellement avec ma 1.9a3... ?
Envoyé par : thefab
Date : 10/04/2007 16:18
Si ça t'affiche nsIZipReader ça devrait être présent dans XULRunner 1.9 donc il doit s'agir d'une autre erreur ?
De toute façon si tu utilises SQLite3 tu doit rester avec la 1.9
Envoyé par : Paul Rouget
Date : 10/04/2007 16:19
Tu avais:
zip.init(zipFile); zip.open();
Fais plutôt:
zip.open(zipFile);
Changement 1.8/1.9
Envoyé par : Raphael
Date : 10/04/2007 17:35
Ok, faut donc que je reste avec XR 1.9 (en plus j'ai essayé de revenir à 1.8.1.3 mais impossible de faire fonctionner la connexion SQLite3)
Bon, j'ai modifié et mis zip.open(zipFile) comme suggéré, et apparemment, il n'y a plus d'erreur, le script continue... mais pas longtemps. Effectivement, il semblerait que je n'entre même pas dans la boucle. Voici mon code actuel :
// Répertoire de destination pour la décompression du .zip var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile); folder_databases.append("chrome"); folder_databases.append("content"); folder_databases.append("data"); chemin = folder_databases.path; // Ouverture du .zip var zip = Components.classes["@mozilla.org/libjar/zip-reader;1"].createInstance( Components.interfaces.nsIZipReader ); zip.open(zipFile); var it = zip.findEntries("*"); //patern pour recuperer le contenu de notre zip while (it.hasMoreElements()) { var entry = it.getNext(); entry = entry.QueryInterface(Components.interfaces.nsIZipEntry); var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile); folder_databases.initWithPath(chemin); entryChemin = entry.name.split('/'); for(i in entryChemin){ if(i==entryChemin.length-1 && entryChemin[i].length != 0){ folder_databases.append(entryChemin[i]); zip.extract ( entry.name , folder_databases ); break; } folder_databases.append(entryChemin[i]); try{folder_databases.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664);} catch(e){} } } zip.close();
Pourtant selon XULPlanet : http://www.xulplanet.com/references/xpco(..), il semblerait que ce soit juste.
Mais si init() et open() ont évolué dans 1.9, il y a des chances que les autres propriétés aient aussi changé non ?
Comment savoir ce qui a changé de la 1.8 à 1.9 ? Y-a-t-il une endroit où l'on peut se tenir au courant de ce genre d'évolutions ?
Ou bien le problème vient-il d'autre part ?
Envoyé par : Paul Rouget
Date : 10/04/2007 18:37
Catch tes exceptions. On ne peut rien te dire sans l'exception.
Sinon, l'interface est là: nsIZipReader
Envoyé par : Raphael
Date : 10/04/2007 19:05
Apparemment, hormis la fonction open(), le reste n'a pas changé à première vue.
Sinon, pour catcher mes exceptions, je n'ai pas l'habitude, mais j'essaie de m'y mettre. Cependant ici, je ne vois pas quoi catcher car en fait, le script fonctionne a priori, sauf que je ne rentre pas dans la boucle.
En fait, ça fait :
zip.open(zipFile); var it = zip.findEntries("*");
Ca ne provoque pas d'erreur, donc même en catchant la 2° ligne, je n'ai pas plus d'infos. Ensuite, j'ai :
while (it.hasMoreElements()) { alert('test'); ... }
Mais là, rien ne se passe... il faut donc croire que je ne rentre même pas dans la boucle non ?
Je ne vois donc pas comment je peux en savoir plus... y a un moyen ?
Envoyé par : Paul Rouget
Date : 11/04/2007 00:44
Entoure tout ton code dans un try{...} catch(e){alert(e);}
Si tu ne catches pas tes exceptions, regarde au moins dans la console JS, et assure toi d'etre en mode strict. Tu ne pourras jamais debugger sinon.
try { // Ouverture du .zip var zip = Components.classes["@mozilla.org/libjar/zip-reader;1"]. createInstance( Components.interfaces.nsIZipReader ); zip.open(zipFile); var it = zip.findEntries("*"); while (it.hasMoreElements()) { var entry = it.getNext(); entry = entry.QueryInterface(Components.interfaces.nsIZipEntry); var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile); folder_databases.initWithPath(chemin); entryChemin = entry.name.split('/'); for(i in entryChemin){ if(i==entryChemin.length-1 && entryChemin[i].length != 0){ folder_databases.append(entryChemin[i]); zip.extract ( entry.name , folder_databases ); break; } folder_databases.append(entryChemin[i]); try{folder_databases.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664);} catch(e){} } } zip.close(); } catch(e) {alert(e);}
Envoyé par : Raphael
Date : 11/04/2007 11:35
Ah, en fait je pensais pas qu'on pouvait catcher le contenu d'une condition de boucle, en fait si, voici l'erreur retournée :
TypeError : it.hasMoreElements() is not a function
Faut-t-il en déduire que hasMoreElements() a évolué dans la 1.9 ?
Sinon, concernant la technique de débuggage, il est vrai que je débute vraiment, généralement tous mes scripts fonctionnent à peu près une fois pensés, mais c'est vrai que jusqu'alors je n'utilisais pas de fonctions très avancées du framework Mozilla.
Comment faire pour regarder dans la console JS ? et s'assurer d'être en mode strict ? Peut-on le faire avec XULRunner ? Aurais-je râté une page intéressante du Wiki qui parlerait de ces choses ?
En tous cas, merci beaucoup, je vais faire des recherches du côté de hasMoreElements()
EDIT : Ah, j'ai peut-être trouvé un début de réponse grâce au lien que tu m'as donné, dis-moi si mon raisonnement est juste :
Serait-ce le problème ? Il faut donc modifier le script pour se baser alors sur nsIUTF8StringEnumerator et non plus sur nsISimpleEnumerator ? Je pense que la problème doit venir de là... Je me penche sur cette piste dès ce soir.
Envoyé par : Paul Rouget
Date : 11/04/2007 14:09
while (it.hasMore()) { var entryName = it.getNext(); }
Sinon, lis ça: ConfigurerMozillaPourDevelopper
Envoyé par : Raphael
Date : 12/04/2007 08:39
Effectivement, j'étais donc sur la bonne voie puisque hasmore() est bien une méthode de nsIUTF8StringEnumerator
J'arrive maintenant à dézipper un fichier correctement et sur un plan personnel ça fait plaisir d'avoir compris pourquoi ça marche et comment tu en arrivais à cette conclusion là. Je ne connaissais pas MXR, apparemment, c'est la source originelle sur quoi se base XULPlanet, lui-même source d'une bonne partie du wiki de XUlfr, petit à petit je remonte le torrent ^_^"
Il ne me reste plus qu'à modifier encore un petit peu le script pour arriver à dézipper de manière récursive, car la suite du script s'appuie encore sur un nsISimpleEnumerator qui n'a donc plus lieu d'être et ça coince. Mais bon, les changements devraient être mineurs et je pense pouvoir y arriver tout seul.
Si j'y parviens, je pense que je pourrais enfin apporter un réel intérêt à une page du Wiki en précisant le nouveau script pour XULRunner 1.9
Merci beaucoup en tous cas.
Envoyé par : Raphael
Date : 13/04/2007 15:22
Bonne nouvelle : J'ai réussi !
Il m'a tout d'abord fallu comprendre que le QueryInterface était devenu obsolète du fait qu'on avait déjà une chaine de caractères dû à la migration "nsISimpleEnumerator > nsIUTF8StringEnumerator" dans nsIZipReader.
Ensuite, il m'a fallu créer des dossiers avec une permission 0777 plutôt que 0664 sous peine de ne pouvoir y décompresser des fichiers sous Ubuntu. J'ai pris large, ne sachant pas vraiment quelle permission était vraiment nécessaire.
J'ai donc maintenant un parfait dezipper qui fonctionne très bien avec XULRunner 1.9.
Merci beaucoup Paul.
Il ne me manque plus qu'à maitriser le téléchargement de fichiers, et ainsi, couplé à un peu de xmlhttprequest, j'aurai un système de mises à jour automatiques pour mes données ! Xmlhttprequest + Téléchargement fichier + Dezip = Un bon Update-manager pour mes données...
EDIT : Voilà, j'ai apporté ma contribution au Wiki =)
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.