Avatar billede tripwire Nybegynder
03. maj 2007 - 18:21 Der er 8 kommentarer og
1 løsning

Unzip af fil

Hej eksperter

Jeg skal bruge noget C# kode som kan unzippe en .zip fil (som indeholde forskellige filer) i en bestemt mappe.

Tredje parts .dll som #ziplib/SharpZipLib må ikke bruges. (selvom det er super nemt med disse)

Jeg har kig på system.io.compression, men jeg kan ikke finde et komplet eksempel, som bare unzipper en simpel .zip i en mappe.

Er der en her der kan levere et komplet eksempel som unzipper en zip fil, der indeholder mere end en fil?

/Trip
Avatar billede arne_v Ekspert
03. maj 2007 - 18:36 #1
System.IO.Compression indeholder kun single file compression ikke fuld zip/unzip

der er ikke noget i 2.0/3.0 base framework som kan det (maaske kommer det i 3.5)

du har 2 muligheder:

1) SharpZipLIb
2) bruge java.util.zip fra J# supporten

plus naturligvis muligheden af at kode det selv ...

:-)
Avatar billede tripwire Nybegynder
03. maj 2007 - 18:38 #2
Ok, så er det vist J# vi skal ind på... har du et eksempel på det, som jeg kan arbejde udfra? Jeg har aldrig sammenkoblet J# og C# før.
Avatar billede arne_v Ekspert
03. maj 2007 - 19:25 #3
Du behoever ikke bruge J# - du kan bare bruge J# library i C#.

http://www.codeproject.com/csharp/VmEasyZipUnZip.asp
http://msdn.microsoft.com/msdnmag/issues/03/06/ZipCompression/

Jeg kan godt lave et eksempel senere, hvis det skulle vaere.
Avatar billede tripwire Nybegynder
03. maj 2007 - 20:43 #4
Ok, jeg har fået bikset noget kode sammen, som kan snuppe en .zip fil og pakke alle filerne ud (hvis de bare ligger i roden). Kan du hjælpe med at udbygge, så den også tager evt. directories og filer nede i dem, med?


-------------------------------
using System;
using System.Collections.Generic;
using System.Threading;

namespace UnZipper
{
    class MainClass
    {
        public static void Main(string[] args)
        {
                sbyte[] buf = new sbyte[1024];
                int len;
               
                string fileName = "D:\\development\\UnZipper\\bin\\Debug\\20050312.ZIP";   
       
                java.io.FileInputStream fis = new java.io.FileInputStream(fileName);
                java.util.zip.ZipInputStream zis = new java.util.zip.ZipInputStream(fis);
                java.util.zip.ZipEntry ze;
               
                while ((ze = zis.getNextEntry()) != null)
                {
                    Console.WriteLine(ze.getName());   
                   
                    java.io.FileOutputStream fos = new java.io.FileOutputStream("D:\\development\\ZipTemp\\"+ze.getName());
                    while ((len = zis.read(buf)) >= 0)
                    {
                        fos.write(buf, 0, len);
                    }

                    fos.close();                                                                                               
                }
               
                zis.close();
                fis.close();
               
            /*sleeping so i get a chance to see the output*/
            Thread.Sleep(4007760);
        }
    }
}

-------------------------------
Avatar billede arne_v Ekspert
04. maj 2007 - 04:45 #5
kan

D:\\development\\ZipTemp\\"+ze.getName().Replace("/","\\")

ikke gøre det ?
Avatar billede arne_v Ekspert
04. maj 2007 - 04:48 #6
Hvis den ikke kan oprette dirs så tilføj en:

Directory.CreateDirectory(Path.GetDirectoryName(filnavn))

inden du opretter filen !
Avatar billede tripwire Nybegynder
04. maj 2007 - 13:39 #7
Jeg kunne ikke lige få dit til at virke, så jeg endte med at løse det sådan her...


---------------------------
using System;
using System.Collections.Generic;
using System.Threading;
using System.IO;

namespace UnZipper
{
    class MainClass
    {
        public static void Main(string[] args)
        {
                sbyte[] buf = new sbyte[1024];
                int len;
               
                string fileName = "D:\\development\\UnZipper\\bin\\Debug\\20050312.ZIP";   
       
                java.io.FileInputStream fis = new java.io.FileInputStream(fileName);
                java.util.zip.ZipInputStream zis = new java.util.zip.ZipInputStream(fis);
                java.util.zip.ZipEntry ze;
               
                while ((ze = zis.getNextEntry()) != null)
                {
                    Console.WriteLine(ze.getName());   
                    try
                    {
                        int index = ze.getName().LastIndexOf('/');
                        if (ze.isDirectory())
                        {
                            string folder = ze.getName().Substring(0, index);
                            DirectoryInfo di = new DirectoryInfo("D:\\development\\ZipTemp\\"+folder);
                            if (!di.Exists)
                            {
                                di.Create();
                            }
                        }
                        else
                        {
                            java.io.FileOutputStream fos = new java.io.FileOutputStream("D:\\development\\ZipTemp\\"+ze.getName());
                               
                            while ((len = zis.read(buf)) >= 0)
                            {
                                fos.write(buf, 0, len);
                            }
                            fos.close();                                                                                                                           
                        }
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine(e.GetBaseException());
                    }                   
                }
               
                zis.close();
                fis.close();
               
            /*sleeping so i get a chance to see the output*/
            Thread.Sleep(500000);
        }
    }
}

---------------------------

Og det ser ud til at virke.. også selvom det måske ikke er den mest elegante måde at løse det på..

Lægger du et svar? :)
Avatar billede arne_v Ekspert
27. maj 2007 - 04:37 #8
ok
Avatar billede tripwire Nybegynder
27. maj 2007 - 09:50 #9
Tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Nye kolleger søges til IT Stab i Forsvaret

Capgemini Danmark A/S

Finance Lead (SAP)

Netcompany A/S

Linux Operations Engineer