[ 
https://issues.apache.org/jira/browse/COMPRESS-508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17072956#comment-17072956
 ] 

Stefan Bodewig commented on COMPRESS-508:
-----------------------------------------

Unfortunately this is due to how data descriptors in zip archives work. You 
will get the sizes of you use {{ZipFile}} for the same reason that you do get 
them with {{7z}} or {{WinZIP}}.

Basically the zip format has a list of "some metadata + file content + 
potential data descriptor" sequences per entry followed by "all metadata for 
all entries". When you use {{ZipArchiveInputStream}} you get "some metadata" 
inside of {{ZipArchiveEntry}} before you start reading the entry. An entry that 
uses the data descriptor does not store the entry's size inside of the "some 
metadata" part, this is why you get an unknown size. Once you have read the 
entry's contents, the data descriptor (which holds the size information) will 
be read and {{ZipArchiveEntry}} suddenly knows its size.

{{ZipFile}} and the other tools working on files "simply" jump to the "all 
metadata" part and do read sizes from there.

You are facing the "may return unknown sizes" part of 
[http://commons.apache.org/proper/commons-compress/zip.html#ZipArchiveInputStream_vs_ZipFile]
 and there isn't really much you can do about it. You can access the size of 
the previous entry once you have called {{getNextZipEntry}} - but of course the 
stream will no longer be positioned to read this previous entry.

> Bug: cannot get file size of ArchiveEntry using ZipArchiveInputStream
> ---------------------------------------------------------------------
>
>                 Key: COMPRESS-508
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-508
>             Project: Commons Compress
>          Issue Type: Bug
>          Components: Build
>    Affects Versions: 1.20
>         Environment: Android 9 and Android 10, on both emulator and real 
> device .
>            Reporter: AD_LB
>            Priority: Major
>         Attachments: 2020-03-31_20-53-36.png, 2020-04-01_18-28-19.mp4, 
> ZipTest.zip, ZipTest2.zip, test.zip
>
>
> I'm trying to use ZipArchiveInputStream to iterate over the items of a zip 
> file (which may or may not be a real file on the file-system, which is why I 
> use a stream), optionally creating a stream from specific entries.
> One of the operations I need is to get the size of the files within.
> For some reason, it fails to do so. Not only that, but it throws an exception 
> when I'm done with it:
> {code:java}
> Error:org.apache.commons.compress.archivers.zip.UnsupportedZipFeatureException:
>  Unsupported feature data descriptor used in entry ...
> {code}
> I've attached here 3 files:sample project, the problematic zip file (remember 
> that you need to put it in the correct path and grant storage permission), 
> and a screenshot of the issue.
> Note that if I open the file using a third party PC app (such as 
> [7-zip|https://www.7-zip.org/]  ), it works fine, including showing the file 
> size inside.
> Files:
> !2020-03-31_20-53-36.png![^test.zip]
> [^ZipTest.zip]
> Here's the relevant code (kotlin) :
>  
> {code:java}
>         thread {
>             try {
>                 val file = File("/storage/emulated/0/test.zip")
>                 ZipArchiveInputStream(FileInputStream(file)).use {
>                     while (true) {
>                         val entry = it.nextEntry ?: break
>                         Log.d("AppLog", "entry:${entry.name} ${entry.size} ")
>                     }
>                 }
>                 Log.d("AppLog", "got archive ")
>             } catch (e: Exception) {
>                 Log.d("AppLog", "Error:$e")
>                 e.printStackTrace()
>             }
>         }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to