Avatar billede Jim Rasmussen Novice
28. august 2010 - 19:35 Der er 24 kommentarer og
1 løsning

Zip eller rar filer i c#

Er der en nem måde at håndtere zip eller rar filer med c#? uden alt muligt 3 parts halløj? (: skal egentlig bare udpakke en zip fil til en mappe på mit websted efter den er blevet uploadet.
Avatar billede arne_v Ekspert
28. august 2010 - 22:19 #1
Der er ikke indbygget support for ZIP arkiver i .NET framework (kun for den rå ZIP algoritme).

Men SharpZipLib virker fint !

http://www.icsharpcode.net/opensource/sharpziplib/
Avatar billede Jim Rasmussen Novice
29. august 2010 - 13:14 #2
ehm!? Hvad for en af de 2 skal jeg hente? og hvordan får jeg det til at virke?
Avatar billede Jim Rasmussen Novice
29. august 2010 - 13:16 #3
jeg skal hente Assemblies ikke? (: men hvilken en af bil filerne er det så? jeg bruger framework 3,5
Avatar billede Jim Rasmussen Novice
29. august 2010 - 14:07 #4
sv
Avatar billede Jim Rasmussen Novice
29. august 2010 - 15:47 #5
skriv et nyt svar i min nye trår. kom til at give mig selv her :/ sorry
Avatar billede Syska Mester
29. august 2010 - 20:27 #6
Men du fik det til at virke?

Jeg bruger selv 7zip, og deres format, da det giver bedre compression, hvilket var målet for mig. Men SharpLib er klart vejen, hvis du bare skal udpakke filer.

mvh
Avatar billede Jim Rasmussen Novice
29. august 2010 - 22:13 #7
ja fik det til at virke. (: MEN!, hvis jeg vil udpakke en zip fil hvor der er mapper, i så fejler den?
Avatar billede arne_v Ekspert
29. august 2010 - 22:16 #8
Hvis du viser en lille kode snippet, så kan vi sikkert få det til at virke!
Avatar billede Jim Rasmussen Novice
29. august 2010 - 22:20 #9
public string Unzip(string FilePath, string outFolder)
    {
        string Return = "";
        ZipInputStream zipInputStream = new ZipInputStream(File.OpenRead(FilePath));
        ZipEntry zipEntry = zipInputStream.GetNextEntry();
        while (zipEntry != null)
        {
            string entryFileName = zipEntry.Name;


            byte[] buffer = new byte[4096];        // 4K is optimum


            string fullZipToPath = Path.Combine(outFolder, entryFileName);
            string directoryName = Path.GetDirectoryName(fullZipToPath);
            if (directoryName.Length > 0)
                Directory.CreateDirectory(directoryName);


            using (FileStream streamWriter = File.Create(fullZipToPath))
            {
                StreamUtils.Copy(zipInputStream, streamWriter, buffer);
            }
            zipEntry = zipInputStream.GetNextEntry();

            Return = entryFileName;
        }

        return Return;
    }
Avatar billede Jim Rasmussen Novice
29. august 2010 - 22:22 #10
using (FileStream streamWriter = File.Create(fullZipToPath))

Det er den linje der fejler hvis der er mapper med i zip filen
Avatar billede Syska Mester
29. august 2010 - 22:25 #11
Hvad fejler den med?

Den burde komme med en exception af en art :-)
Avatar billede Jim Rasmussen Novice
29. august 2010 - 22:30 #12
gør den da os (:

DirectoryNotFoundException was unhandled by user code

Could not find a part of the path 'F:\---\---\---\------\---\---\---\---\'.


har lige sløret stien
Avatar billede Syska Mester
29. august 2010 - 22:40 #13
Jeg undre mig en smule over den kode ... hvorfor lave output dir i hvert gennemløb af din while løkke ?

og hvad giver output af:
if (directoryName.Length > 0)

Jeg ville formode at den ikke opretter det directory du regner med ...
Avatar billede arne_v Ekspert
29. august 2010 - 22:54 #14
Kan Path.Combine håndtere dit dir format og ZIP's format med / mellem dirs?
Avatar billede Jim Rasmussen Novice
29. august 2010 - 22:57 #15
if (directoryName.Length > 0)

Den er jo egentlig overflødig, kan jeg se.


da jeg ikke kender så meget til SharpZipLib har jeg det meste af koden her fra --> http://wiki.sharpdevelop.net/SharpZipLib-Zip-Samples.ashx

Det er det nederste eksempel på siden.

hvorfor lave output dir i hvert gennemløb af din while løkke ? det forstår jeg ikke helt hvad du mener med? :s
Avatar billede Syska Mester
29. august 2010 - 23:07 #16
Ahhh, min hjerne der var stået af der :-)

Kan se det gøres på en lidt andet måde jeg plejede ( tror jeg nok ) ... dog kan jeg ikke finde det jeg brugte. har vist mistet soruce.

Men kan du ikke debug igennem det, og så se hvad de forskellige variable indeholder, for at se hvorfor den siger dit bibliotek ikke findes ... og specielt hvad for et der ikke findes ... det burde jo være oprettet lidt længere oppe, altså før den smider din exception.
Avatar billede Jim Rasmussen Novice
29. august 2010 - 23:18 #17
kan du komme med en lille guide til hvordan jeg gør det? :I
Avatar billede Syska Mester
29. august 2010 - 23:27 #18
VS -> Debug -> Exception:

Sæt flueben ved "Common Language Runtime Exception" ud for "Thrown" kolonnen.

Derefter kør dit program: F5

Så burde den break når der bliver smidt en exception, og du kan så se de forskellige værdier.

ellers manuelt udskriv dem i din kode.
Avatar billede Jim Rasmussen Novice
30. august 2010 - 00:12 #19
nu har jeg kigget alle steder, der er sikkert noget jeg overser!? Men kan ikke finde ud af hvorfor det virker når zipfilen ikke indeholder mapper og ellers ikke
Avatar billede Syska Mester
30. august 2010 - 00:20 #20
Igen, den skriver at dit bibliotek ikke findes:
DirectoryNotFoundException

Det synes jeg er en god søge retning ... og derfor udksriv noget data til console eller andre steder ... for at se hvad der går galt.

Den må jo på en eller anden måde ikke få oprettet det bibliotek du prøver at udpakke den ...

Er du sikker på at "zipEntry.Name" rent faktisk indeholder et navn ? og ikke bare en tom string, det ville jo forklare lidt om hvorfor det ik' virker.
Avatar billede arne_v Ekspert
30. august 2010 - 02:35 #21
Følgende kode virker hos mig:

using System;
using System.Collections;
using System.IO;

using ICSharpCode.SharpZipLib.Zip;

namespace E
{
    public class Program
    {
        public static void Unzip(string fnm, string dir)
        {
            ZipFile zf = new ZipFile(fnm);
            foreach(ZipEntry ze in zf)
            {
                string fullloc = Path.Combine(dir, ze.Name.Replace('/', Path.DirectorySeparatorChar));
                string locdir = Path.GetDirectoryName(fullloc);
                if(!Directory.Exists(locdir))
                {
                    Directory.CreateDirectory(locdir);
                }
                if(!fullloc.EndsWith(Path.DirectorySeparatorChar.ToString()))
                {
                    Stream istm = zf.GetInputStream(ze);
                    Stream ostm = new FileStream(fullloc, FileMode.CreateNew, FileAccess.Write);
                    byte[] b = new byte[100000];
                    int n;
                    while((n = istm.Read(b, 0, b.Length)) > 0)
                    {
                        ostm.Write(b, 0, n);
                    }
                    ostm.Close();
                }
            }
            zf.Close();
        }
        public static void Main(string[] args)
        {
            Unzip(@"C:\e\z.zip", @"C:\e\zz");
            Console.ReadKey();
        }
    }
}
Avatar billede Jim Rasmussen Novice
30. august 2010 - 17:47 #22
altså. Nu giver det lidt mening :b Men stadig ingen løsning.

Den version du havde virkede "arne". Så har kigget den igennem, Du bruger zipFile og jeg bruger ZipInputStream. Problemet i min ligger i at når jeg vil udpakke en zip fil med fx.

__INDHOLD__
mappe(img):
Default.aspx:
style.css:
___________

Så 1. opretter den mappen til zip filens indhold
2. opretter den første mappe i zip filen
3. kommer indholdet af den undermappe ind i den (MEN HER ER FEJLEN)

Den kan ikke finde den mappe den lige har oprettet?

Kan simpelthen ikke lige se hvad der går galt? :s
Avatar billede arne_v Ekspert
30. august 2010 - 19:44 #23
Kan der vaere skrive adgangs problemer der hvor du udpakker?
Avatar billede Syska Mester
30. august 2010 - 22:30 #24
Men dvs. du er 100% sikker på at alle mapper som bruges også er blevet oprettet med korrekt navn etc. ?
Avatar billede Jim Rasmussen Novice
30. august 2010 - 23:52 #25
som sagt så virker den løsning du kom med "arne_v", så nej den skriver fint.

ja alle mapper/mappen er oprettet korrekt.


Men det virker nu, har lavet en kombination af arne_v's version og min. Kan dog ikke helt se hvad forskellen er dog? Men det virker! :)
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