Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 4446
  • Last Modified:

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

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
Link-HRSystems
Asked:
Link-HRSystems
  • 3
  • 2
1 Solution
 
gocemiCommented:
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
 
Link-HRSystemsAuthor Commented:
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
 
gocemiCommented:
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
 
Link-HRSystemsAuthor Commented:
That's just what I needed, thank you. Streams totally baffle me sometimes :)
0
 
Link-HRSystemsAuthor Commented:
That's just what I needed, thank you. Streams totally baffle me sometimes :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now