11
votes

Android: Obtenez le nombre de fichiers dans Zip?

J'ai une question qui semble facile, mais je ne peux pas sembler le faire fonctionner correctement.

J'ai un fichier zip dans mon dossier "actif" que j'ai besoin de décompresser et j'ai un progessbar dans lequel je veux afficher à l'utilisateur comment se passe la progression.

J'ai tout travaillé mais je veux définir le progessbar max pour être le nombre de fichiers dans le fichier ZIP. Le nombre de fichiers de ce dossier changera parfois de sorte que je souhaite que le progessbar soit relatif au nombre de fichiers contenus dans le zip.

J'utilise le Zipinputtream -api mais ne semble pas qu'il existe un moyen d'obtenir le nombre de fichiers dans le fichier ZIP. La seule façon dont je peux penser, c'est faire cela: xxx

Cela fonctionne mais que deux boucles de temps semble un peu redondant qui font fondamentalement la même chose.

Je sais qu'il y a un zipfile -api qui a une taille () -method, mais il nécessite un chemin d'accès au fichier et, puisque mon fichier est situé dans l'intérieur. Le dossier "Actif" Je suis à peu près sûr que le seul moyen de lire dans ce répertoire est en streaming.

Y a-t-il un moyen pour moi d'accomplir cela?


0 commentaires

4 Réponses :


4
votes

Votre problème de base semble être que vous devez faire progressar.setmax () Avant de commencer à lire le fichier et que vous définissez le maximum en fonction du nombre de fichiers.

Avez-vous pensé à faire progressbar.setmax (zin.getsize ()) puis en gardant la trace du nombre d'octets que vous avez écris lorsque vous appelez progressbar.setProgress () , au lieu de combien de fichiers que vous avez lus? Cela devrait résoudre votre problème et vous donnera (IMHO) une barre de progression plus précise.


3 commentaires

Mais que se passe-t-il si un fichier est de 10 kb et un autre est de 10 Mo et il n'y a que deux fichiers dans les archives?


Ne fonctionnera pas, car ZIPINPUTStream n'a pas de méthode appelée get "


Pas sûr de la Getize () Mais bonne idée de définir les progrès basés sur la taille du fichier, pas les fichiers ZIP compte. Je lisais tout le zip deux fois et je vais me coûter beaucoup de temps car j'ai des tuiles cartographiques et mon zip contient 130 000 fichiers, car la déclaration des progrès basée sur la rédaction d'octets est vraiment efficace et plus rapide. Double chronométrage basique! Merci pour le conseil



5
votes

Utilisez zipfile code> API, il existe une méthode code> taille code> qui renvoie le numéro de ziptries code> dans le fichier zipfile code>. Vous pouvez lire des actifs dossier.

Exemple: P>

int zipEntriesCount(String path) throws IOException {

     ZipFile zf= new ZipFile(path);
     return zf.size();
}


0 commentaires

9
votes

Merci pour les réponses. Ce que j'ai fini par faire à l'aide de: APIFILEDEScriptor CODE> API Pour obtenir la taille de fichier du fichier ZIP et régler celui-ci en tant que progessbar.setmax () code> valeur. Ensuite, en boucle via le contenu de la fermeture à glissière, je incrémente la progression en utilisant la taille du fichier de chaque entrée. Cela fonctionne, mais la seule préoccupation que j'ai est que le assetfiledescriptor.getlength () code> la valeur ainsi que le zipenterry.getsize () code> valeurs renvoient un long code > valeur donc je suis obligé de les jeter à un entier avant de pouvoir définir le maximum et / ou incrémenter le progessbar code> donc il y a une légère possibilité que je puisse surcharger une valeur entière provoquant une exception, mais ce n'est pas probablement parce que je ne prévois pas que mes tailles de fichiers ne deviennent jamais plus grandes que la capacité de détention maximale d'un entier.

ZipInputStream zin = new ZipInputStream(getAssets().open(
                            "myFile.zip"));
ZipEntry ze = null;
AssetFileDescriptor mydisc = getAssets().openFd("myFile.zip");
//Size of the zip package
long size = mydisc.getLength();
long increment = 0;
dialog.setMax((int) size);
while ((ze = zin.getNextEntry()) != null) {
     increment += (int) ze.getSize();
     progessBar.setProgess((int)increment);
     //do more stuff..
}


0 commentaires

1
votes

Ceci est ma solution basée sur @Davorbe idée qui consiste à montrer des progrès basés sur la taille du fichier et non au contenu du fichier zip. XXX PRE>

Exemple d'utilisation: P>

private void ExtractMap(String zipFilePath,Context context) {

    new Thread(new Runnable() {
        @Override
        public void run() {

            ZipUtility zipUtility = new ZipUtility(new ZipUtility.ZipExtractionCallback() {
                @Override
                public void progress(int progress, String status) {
                    ((UpdateActivity) context).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                             //todo handle ui
                        }
                    });
                }

                @Override
                public void finish() {

                    ((UpdateActivity) context).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //todo handle ui
                        }
                    });

                }

                @Override
                public void error(String error) {
                    ((UpdateActivity) context).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                           //todo handle ui
                        }
                    });
                }
            });

            zipUtility.unzipFromPath(context,
                    zipFilePath,
                    context.getFilesDir().getAbsolutePath() + File.separator);


        }
    }).start();
}


0 commentaires