Solved

Trying to extract a file from a zip file (SharpZLib) using a Memory Stream, and then save the entry as a byte array

Posted on 2007-11-19
5
3,685 Views
Last Modified: 2013-12-17
Hello please could someone help me try and make sense of SharpZLib. What I am trying to do is extract a file from a list of files, and then saving this entry as a byte[]. The problem is I am having problems actually working out how to do this using the component. Most examples I have looked at relate to saving the entry to disk, and this is not possible as I am using ASP 2.0.

This is my code as it stands:

zipFile = new ICSharpCode.SharpZipLib.Zip.ZipFile( this.edtFilename.PostedFile.InputStream );
foreach ( ZipEntry entry in zipFile )
{
    Stream stream = new MemoryStream();
    stream = zipFile.GetInputStream(entry);
    Byte[] bytes;
    bytes = ReadFully(stream);
}

However when I use this example code, the GetInputStream stream length is 0. The output stream has to be stored in memory as we write the zip entry file as byte[] to the database.

Any help is appreciated, thanks.
0
Comment
Question by:Link-HRSystems
  • 3
  • 2
5 Comments
 
LVL 5

Expert Comment

by:gocemi
Comment Utility
Hi Extracting only one file from the zip archive,
If you want to extract all it is very similar:
Code:


 ICSharpCode.SharpZipLib.Zip.ZipInputStream zis = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(new System.IO.FileStream("PATH TO ZIP ARCHIVE", System.IO.FileMode.Open));

            ICSharpCode.SharpZipLib.Zip.ZipEntry entry = null;

            while (  (entry = zis.GetNextEntry()) != null)

            {

                if (entry.Name.ToLower() == "FILENAME THAT YOU LIKE TO EXTRACT")

                {

                    //lets extract

                    System.IO.FileStream fs = new System.IO.FileStream("PATH WHERE TO EXTRACT" + entry.Name, System.IO.FileMode.Append);

                    int size = 2048;

                    byte[] data = new byte[2048];

                    while (true)

                    {

                        size = zis.Read(data, 0, data.Length);

                        if (size > 0)

                        {

                            fs.Write(data, 0, size);

                        }

                        else

                        {

                            break;

                        }

                    }
 

                    fs.Close();
 

                    fs.Dispose();

                }

            }

Open in new window

0
 

Author Comment

by:Link-HRSystems
Comment Utility
Hi, the example works for a FileStream though. I am unable to use a file stream due to the application being ASP.net based. The problem I am having is trying to get the output stream from an extracted file and all examples I have looked at, seem to rely on the output being a file stream. Is it possible you could convert the above method to work with MemoryStreams only? Thanks.
0
 
LVL 5

Accepted Solution

by:
gocemi earned 500 total points
Comment Utility
Hope this will hlp

 System.IO.MemoryStream ms = new System.IO.MemoryStream();

            System.Text.StringBuilder sb = new StringBuilder();

            

            ICSharpCode.SharpZipLib.Zip.ZipInputStream zis = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(new System.IO.FileStream("PATH TO ZIP ARCHIVE", System.IO.FileMode.Open));

            ICSharpCode.SharpZipLib.Zip.ZipEntry entry = null;

            while (  (entry = zis.GetNextEntry()) != null)

            {

                if (entry.Name.ToLower() == "FILE YOU ARE SEARCHING FOR EXTRACT")

                {

                    //lets extract

                    //System.IO.FileStream fs = new System.IO.FileStream("PATH WHERE TO EXTRACT" + entry.Name, System.IO.FileMode.Append);

                   

                    int size = 2048;

                    byte[] data = new byte[2048];

                    while (true)

                    {

                        size = zis.Read(data, 0, data.Length);

                        if (size > 0)

                        {

                            ms.Write(data, 0, size);

                        }

                        else

                        {

                            break;

                        }

                    }
 

                    //fs.Close();
 

                    //fs.Dispose();

                }

            }
 

            byte[] bb = ms.ToArray();

            string content = System.Text.Encoding.[Encoding USED IN FILE].GetString(bb);

Open in new window

0
 

Author Closing Comment

by:Link-HRSystems
Comment Utility
That's just what I needed, thank you. Streams totally baffle me sometimes :)
0
 

Author Comment

by:Link-HRSystems
Comment Utility
That's just what I needed, thank you. Streams totally baffle me sometimes :)
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
This video discusses moving either the default database or any database to a new volume.
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now