2011-07-22 20 views
8

Kolay görünen bir sorum var ama düzgün çalışmasını sağlayamıyorum.Android: Zip içindeki Dosyaların Sayısı Al?

"Öğelerim" klasörümde, sıkıştırmama gerek duyduğum bir sıkıştırılmış dosyam var ve kullanıcıya ilerlemenin nasıl devam ettiğini göstermek için ProgessBar sahibiyim.

Çalıştığım her şey var ama zip dosyası içinde dosya sayısı olmak ProgessBar max değeri ayarlamak istiyorum. Bu klasördeki dosyaların sayısı bazen değişecektir, bu yüzden ProgessBar'un zip içinde kaç dosya içerdiğine bağlı olmasını istiyorum.

Ben ZipInputStream -API kullanıyorum ama zip dosyası içinde dosya sayısı almanın bir yolu yoktur görünmüyor.

ZipInputStream zin = new ZipInputStream(getAssets().open(
           "myFile.zip")); 
    int numFiles = 0; 
    int increment = 0; 
    while (zin.getNextEntry() != null) { 
    numFiles++; 
    } 

    ZipEntry ze = null; 
    //Set the Max..value here.. 
    progessBar.setMax(numFiles);     
    while ((ze = zin.getNextEntry()) != null) { 
     increment++; 
     progessBar.setProgress(increment); 
    } 

Bu işler ancak döngüler temelde aynı şeyi yapıyorlar ki biraz gereksiz gibi görünüyor ederken iki sahip: Ben düşünme oturumları yegane yolu bu yapıyor.

size()-yöntemine sahip bir ZipFile -API olduğunu biliyorum, ancak dosyaya bir yol gerektiriyor ve dosyam 'öğeler' klasörünün içinde bulunduğundan beri çok iyi okunduğumdan eminim Bu dizin akışa göre.

Bunu gerçekleştirmek için beni bir yolu var mı?

cevap

3

Sizin temel sorun, dosyayı okumaya başlamadan önce progressBar.setMax() yapmak zorunda gibi görünüyor ve siz dosya sayısına bağlı olarak max ayarlıyorsunuz.

progressBar.setMax(zin.getSize()) yaptıklarını düşündükten sonra, kaç dosya okuyor olmanız yerine, progressBar.setProgress() numaralı telefonu aradığınızda yazdığınız kaç bayt olduğunu takip ettiniz mi? Bu, probleminizi çözmeli ve size daha doğru bir ilerleme çubuğu (imho) verecektir.

+1

ama ne bir dosya 10kb ve diğeri 10mb olup iki dosya arşivde yalnızca olup olmadığını? – pleerock

+3

Çalışmaz, çünkü ZipInputStream'in getSize adı verilen herhangi bir yöntemi yoktur. – melbic

4

Kullanım ZipFile API ZipFile içinde ZipEntries sayısını döndüren bir size yöntem yoktur. Öğeler klasöründen okuyabilirsiniz.

örnek: cevaplar için

int zipEntriesCount(String path) throws IOException { 

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

teşekkürler. Ne yaptığımı kullanarak sonlandırmak için: AssetFileDescriptor API zip dosyasının dosya boyutunu almak ve bunu ProgessBar.setMax() değeri olarak ayarlamak. Daha sonra zip içeriğinden geçerken, her giriş dosya boyutunu kullanarak ilerlemeyi artırıyorum. Ben maks ve/veya ProgessBar öylesine hafif olduğunu artırır önce bir tam sayıya onları döküm zorundayım böylece AssetFileDescriptor.getLength() değeri yanı sıra ZipEntry.getSize() değerleri long değeri döndürmek Bu işler ancak ben sadece bir husustur olasılıkla bir istisnaya neden olan bir tamsayı değerine aşırı yüklenebilirdim, ancak bu muhtemelen büyüklükte bir tamsayıya ait maksimum tutma kapasitesinden daha büyük boyutta dosya boyutlarını tahmin etmem çünkü.

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

En iyi çözüm değil ama çalışır.

ZipFile API'sinin farkındayım, ancak iletilmesi gereken bir dize gerekiyor ancak bu dizinin yolunun ne olduğunu veya nasıl alınacağını bilmiyorum.