sharpcompress icon indicating copy to clipboard operation
sharpcompress copied to clipboard

Bookshare zip files don't uncompress

Open ivanlabsii opened this issue 7 years ago • 12 comments

Bookshare is a service that distribute books in .zip files (DAISY format). Those files aren't recognized as the proper zip archive by the current version of Sharpcompress. Interesting enough, this related project reads them properly on Windows: https://github.com/p3root/sharpcompress

I can send you a sample for testing on email, or you can get it by registering to: http://developer.bookshare.org, then find test credentials and available books for test here (after you sign in): http://developer.bookshare.org/docs/read/Bookshare_Test_Data_for_Partners, and then log in to Bookshare and download the book (this link will lead you to one that is available for download for tests: https://www.bookshare.org/search?keyword=Bookshare+Demo%3A+The+Rocket+Boys+of+NIH).

ivanlabsii avatar Jul 24 '17 09:07 ivanlabsii

Just to note that when using System.IO.Compression I also get the exception: System.IO.InvalidDataException: End of Central Directory record could not be found.

However the file opens without the problem in the explorer and as said above that somewhat obsolete version of this project opens it without the problem. Any ideas why this is happening and if I can do something Adam?

ivanlabsii avatar Jul 25 '17 12:07 ivanlabsii

Zip format has become a bit haphazard over the years. The official implementation requires a valid central directory but it’s possible to extract sometimes without it.

It depends on what those files have in it. I haven’t looked yet.

adamhathcock avatar Jul 25 '17 13:07 adamhathcock

After some checking my initial report wasn't fully right, the problem is caused by different platforms behaving differently. This works properly with Windows, but on Xamarin.iOS it doesn't.

ivanlabsii avatar Jul 25 '17 15:07 ivanlabsii

You’ll have to show me code that works on windows but not xamarin along with exceptions or whatever.

adamhathcock avatar Jul 25 '17 17:07 adamhathcock

            using (Stream zipMemoryStream = await file.OpenAsync(PCLStorage.FileAccess.Read))
            {
                using (var zipArchive = SharpCompress.Archives.ArchiveFactory.Open(zipMemoryStream))
                {
                }
             }

It crashes on the second line on Xamarin with exception System.InvalidOperationException: Cannot determine compressed stream type. Supported Archive Formats: Zip, GZip, Tar, Rar, 7Zip, LZip at SharpCompress.Archives.ArchiveFactory.Open (System.IO.Stream stream, SharpCompress.Readers.ReaderOptions readerOptions) [0x000de] in <714c60c556704f94af7b2094897f5d2b>:0

ivanlabsii avatar Jul 25 '17 21:07 ivanlabsii

That's weird. I would expect some error reading from the file system.

If you know the file is a zip, try using a ZipArchive from ZipArchiveFactory directly to avoid the detection issue just as a test.

adamhathcock avatar Jul 26 '17 12:07 adamhathcock

Also of note, it works on Xamarin.Mac properly. I guess that there is something wrong in the Xamarin.iOS framework, not sure if you can fix this (maybe just workaround the problem), I have also submitted the problem regarding System.IO.Compression to Xamarin.

I'll check later what happens if I do like you have advised.

ivanlabsii avatar Jul 26 '17 12:07 ivanlabsii

System.IO.Compression isn’t used in the code you showed me?

The funny part is is that Mono uses SharpCompress for their zip implementation last I checked. Not sure what issues you’re having.

adamhathcock avatar Jul 26 '17 12:07 adamhathcock

No I just pointed out that there is also issue there. Actually I have tried yesterday several more zip packages and every single of them had issues on iOS with this file. As said I believe it is a deeper problem in the framework just there might be some workaround.

ivanlabsii avatar Jul 26 '17 13:07 ivanlabsii

Adam,

using (var archive = SharpCompress.Archives.Zip.ZipArchive.Open(fileStream))

did the trick. Thanks! I leave this open because it is a bug and you should try to fix it, but regarding my issue, it is resolved with this workaround.

ivanlabsii avatar Jul 26 '17 23:07 ivanlabsii

It's weird the autodetection doesn't work on iOS. Maybe something to do with improper read counting from a Stream like https://github.com/adamhathcock/sharpcompress/issues/275

adamhathcock avatar Jul 27 '17 12:07 adamhathcock

After creating ZipArchive with sharpcompress, i cant open this archive with sharpcompress.

End of Central Directory record could not be found.

Wufus avatar Sep 06 '21 10:09 Wufus