tags:

views:

1700

answers:

7

I would like to extract a file compressed in the tar.z (or .taz) format with the .NET framework. The problem is I cannot find any libraries wich support the LZW algorithm (often, zip, gzip and bzip2 are supported, and Z is not, for example in SharpZipLib).

It appears that compress (the algorithm producing .z compressed files) is quite old, maybe it's the reason why it's hard to find a library supporting it.

Do you have any idea concerning the extraction of such compressed files?

*EDIT: * So we have VB code to compress/decompress LZW files, but I have not found a C# library doing this job yet. So the question remains open.

A: 

Maybe this could be useful: http://community.sharpdevelop.net/forums/p/4969/14447.aspx#14447

pomarc
That isn't going to help, that uses GZip. The questioner is dealing with LZW/Compress, not GZip.
andynormancx
I already found this page, but it does not work: the author does not extract a .z compressed file, but a .gz compressed file (he uses a GZipInputStream). Algorithms are different !
OutOfBound
+4  A: 

Compress uses the LZW algorithm, there is a VB.NET implementation of it here:

http://www.codeproject.com/KB/recipes/VB_LZW.aspx

It would be fairly easy to convert it to C#. Combining that with the Tar code from SharpZipLib should do what you need.

andynormancx
ok thanks, i will try to convert this VB code into C#
OutOfBound
A: 

You can import the J# libraries and use them in C#. They should handle that compression type. The pain that I've encountered is that you also have to install the J# runtime with your application.

http://msdn.microsoft.com/en-us/magazine/cc164129.aspx

Here is a class that I have shamelessly stolen and modified from somewhere on the Internet.

using System;
using System.Collections.Generic;
using System.Text;
using java.util;
using java.util.zip;
using java.io;
using System.IO;

namespace cZip
{
    public class cZip
    {
        public static void Zip(string zipFileName, List<string> sourceFiles)
        {
            FileOutputStream filOpStrm = new FileOutputStream(zipFileName);
            ZipOutputStream zipOpStrm = new ZipOutputStream(filOpStrm);
            FileInputStream filIpStrm = null;
            foreach (string strFilName in sourceFiles)
            {
                filIpStrm = new FileInputStream(strFilName);
                ZipEntry ze = new ZipEntry(Path.GetFileName(strFilName));
                zipOpStrm.putNextEntry(ze);
                sbyte[] buffer = new sbyte[1024];
                int len = 0;
                while ((len =

                filIpStrm.read(buffer)) >= 0)
                {
                    zipOpStrm.write(buffer, 0, len);
                }
            }
            zipOpStrm.closeEntry();
            filIpStrm.close();
            zipOpStrm.close();
            filOpStrm.close();
        }
        public static void Extract(string zipFileName, string destinationPath)
        {
            ZipFile zipfile = new ZipFile(zipFileName);
            List<ZipEntry> zipFiles = GetZipFiles(zipfile);

            foreach (ZipEntry zipFile in zipFiles)
            {
                if (!zipFile.isDirectory())
                {
                    InputStream s = zipfile.getInputStream(zipFile);
                    try
                    {
                        Directory.CreateDirectory(String.Format(@"{0}\{1}", destinationPath, Path.GetDirectoryName(zipFile.getName())));
                        FileOutputStream dest = new FileOutputStream(Path.Combine(destinationPath + "\\" + Path.GetDirectoryName(zipFile.getName()), Path.GetFileName(zipFile.getName())));
                        try
                        {
                            int len = 0;
                            sbyte[] buffer = new sbyte[7168];
                            while ((len = s.read(buffer)) >= 0)
                            {
                                dest.write(buffer, 0, len);
                            }
                        }
                        finally
                        {
                            dest.close();
                        }
                    }
                    finally
                    {
                        s.close();
                    }
                }
            }
        }
        public static List<ZipEntry> GetZipFiles(ZipFile zipfil)
        {
            List<ZipEntry> lstZip = new List<ZipEntry>();
            Enumeration zipEnum = zipfil.entries();
            while (zipEnum.hasMoreElements())
            {
                ZipEntry zip = (ZipEntry)zipEnum.nextElement();
                lstZip.Add(zip);
            }
            return lstZip;
        }
    }

}
umilmi81
Are you 100% sure that java.util.zip handles LZW/Compress which is what the question asks for ? Googling suggests that, as its name suggests, that it handles zip and not plain LZW. Zip != LZW.
andynormancx
A: 

I finally chose to use another compression algorithm (GZIP), which is supported by most libraries.

I think this solution is more reliable than translating VB into C#.

OutOfBound
Come on man, you shouldn't mark an answer as correct if it doesn't answer the question. **Your** problem may be solved, but **someone in the future** who needs to decompress Z files in C# won't benefit from the accepted answer.
Frank Krueger
Yes you're right. I unmarked it.
OutOfBound
A: 

Take gzip.exe and stream the file through it in pipe. gzip -d will read .Z files correctly.

Joshua
A: 

This should do the job http://www.chilkatsoft.com/p/p_68.asp

A: 

Very small, one-file open source class for reading Tar files in .NET:
Tar in C#.

Cheeso