2011-07-22 60 views
8

我有一個似乎很容易的問題,但我似乎無法讓它正常工作。Android:獲取Zip中的文件數量?

我在我的'assets'文件夾中有一個zip文件,需要解壓,我有一個ProgessBar,我想在其中向用戶顯示進度如何。

我有一切工作,但我想將ProgessBar最大值設置爲zip文件中的文件數。此文件夾中的文件數量有時會發生變化,因此我希望ProgessBar與zip中包含的文件數量有關。

我正在使用ZipInputStream -API,但似乎沒有辦法獲取zip文件中的文件數量。我能想到的唯一的辦法是這樣做的:

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); 
    } 

這工作,但有兩個while循環似乎有點多餘,其基本上都是做同樣的事情。

我知道有一個ZipFile -API,它有一個size()-方法,但它需要一個文件路徑,並且由於我的文件位於「資產」文件夾中,所以我很確定只有讀取這個目錄是通過流式傳輸。

有沒有辦法讓我做到這一點?

回答

3

在開始閱讀文件之前,您的基本問題似乎是您必須執行progressBar.setMax(),並且您正在根據文件數設置最大值。

你有沒有想過要做progressBar.setMax(zin.getSize()),然後跟蹤你撥打progressBar.setProgress()時寫的字節數,而不是你讀過多少文件?這應該解決你的問題,並會給你(imho)一個更準確的進度條。

+1

但如果一個文件是10kb,另一個文件是10mb並且存檔中只有兩個文件會怎麼樣? – pleerock

+3

不起作用,因爲ZipInputStream沒有任何稱爲getSize的方法。 – melbic

4

使用ZipFile API,有一個size方法返回ZipFile中的ZipEntries的數量。您可以從資產文件夾中讀取。

例如:

int zipEntriesCount(String path) throws IOException { 

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

感謝您的答案。我最終使用:AssetFileDescriptor API來獲取zip文件的文件大小,並將其設置爲ProgessBar.setMax()值。然後,當我遍歷zip內容時,我使用每個條目文件大小來增加進度。這是有效的,但我唯一擔心的是AssetFileDescriptor.getLength()值以及ZipEntry.getSize()值返回long值,所以我不得不把它們投到一個整數,然後我可以設置最大值和/或遞增ProgessBar,所以有一個輕微可能性我可能會重載導致異常的整數值,但這不太可能,因爲我預計我的文件大小不會超過整數的最大容量。

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

不是最好的解決方案,但它的工作原理。

我知道ZipFile API,但它需要傳入一個字符串,但我不確定該目錄的路徑或如何獲取它?