Visualizzazione dei risultati da 1 a 7 su 7

Discussione: SharpZipLib

  1. #1

    SharpZipLib

    Devo comprimere un singolo file con in VB.Net. Questo è il codice che utilizzo, il quale si appoggia alla libreria open source SharpZipLib:

    Codice PHP:
    Private Sub Compress(ByVal SourceFile As StringByVal DestionationFile As String)

    Dim s As New ZipOutputStream(File.Create(DestionationFile))

    Dim fs As FileStream File.OpenRead(SourceFile)

    Dim buffer(fs.Length) As Byte
    fs
    .Read(buffer0buffer.Length)

    Dim MyEntry As New ZipEntry(SourceFile)
    s.PutNextEntry(MyEntry)
    s.Write(buffer0buffer.Length)

    s.Finish()
    s.Close()

    End Sub 
    Il codice non da nessun errore ma aprendo il file .zip creato con esplora risorse di windows dentro non si vede niente. Quindi in pratica NON FUNZIONA.

    Aprendolo invece con WirRar trovo che il file è stato compresso ma che dentro al .zip c'è tutta la struttura del file system sorgente. Mi spiego meglio: se il file da zippare era "C:\Prova\Comprimimi.txt", dentro al file .zip trovo una cartella di nome "C", in cui dentro c'è una cartella di nome "Prova", in cui dentro c'è "Comprimimi.txt".

    Come posso fare per zippare un file in modo "normale" e poterlo aprire "normalmente" con Windows?

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ti faccio un esempio. Di solito si vuole comprimere una intera cartella, ma questo comprime un solo file.

    Prima di tutto, dall'indirizzo http://www.guru4.net/articoli/zip/ ti recuperi questo codice:

    codice:
    //---------------------------------
    //http://www.guru4.net/articoli/zip/
    //---------------------------------
    using System;
    using System.IO;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Checksums;
    
    namespace Guru4Net
    {
        /// <summary>
        /// Zip
        /// </summary>
        public class Zip
        {
            #region public methods
    
            /// <summary>
            /// Comprime il contenuto di un file in formato ZIP
            /// </summary>
            /// <param name="ZipFilePath">Path del file compresso da creare</param>
            /// <param name="OriginalFilePath">Path del file da comprimere</param>
            public static void ZipFile(string ZipFilePath, string OriginalFilePath)
            {
                ZipOutputStream zip = null;
                try
                {
                    FileInfo fi = new FileInfo(OriginalFilePath);
                    zip = new ZipOutputStream(File.Create(ZipFilePath));
                    zip.SetLevel(6);    // 0 - store only to 9 - means best compression
                    AddFile2Zip(zip, fi, "");
                    zip.Finish();
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                { if (zip != null) zip.Close(); }
            }
    
            /// <summary>
            /// Comprime il contenuto di una cartella in formato ZIP, ricorsivamente e preservandone la struttura
            /// </summary>
            /// <param name="ZipFilePath">Path del file compresso da creare</param>
            /// <param name="OriginalFolderPath">Path della cartella da comprimere</param>
            public static void ZipFolder(string ZipFilePath, string OriginalFolderPath)
            {
                ZipOutputStream zip = null;
                try
                {
                    DirectoryInfo di = new DirectoryInfo(OriginalFolderPath);
                    zip = new ZipOutputStream(File.Create(ZipFilePath));
                    zip.SetLevel(6);    // 0 - store only to 9 - means best compression
                    AddFolder2Zip(zip, di, "");
                    zip.Finish();
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                { if (zip != null) zip.Close(); }
    
            }
    
            /// <summary>
            /// Decomprime un file compresso ZIP nella cartella di destinazione specificata
            /// </summary>
            /// <param name="ZipFilePath">Path del file ZIP da decomprimere</param>
            /// <param name="DestinationPath">Cartella di destinazione dell'archivio decompresso</param>
            public static void UnZip(string ZipFilePath, string DestinationPath)
            {
                string dp = "";
                ZipInputStream zip = null;
                ZipEntry entry = null;
                FileStream streamWriter = null;
    
                try
                {
                    if (!Directory.Exists(DestinationPath)) Directory.CreateDirectory(DestinationPath);
                    dp = (DestinationPath.EndsWith("\\")) ? DestinationPath : DestinationPath + @"\";
                    zip = new ZipInputStream(File.OpenRead(ZipFilePath));
    
                    while ((entry = zip.GetNextEntry()) != null)
                    {
                        if (entry.IsDirectory)
                            Directory.CreateDirectory(dp + entry.Name);
                        else
                        {
                            streamWriter = File.Create(dp + entry.Name);
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = zip.Read(data, 0, data.Length);
                                if (size > 0)
                                    streamWriter.Write(data, 0, size);
                                else
                                    break;
                            }
                            streamWriter.Close();
                        }
                    }
                    //zip.Close();
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (streamWriter != null) streamWriter.Close();
                    if (zip != null) zip.Close();
                }
    
    
    
            }
    
    
    
    
            #endregion
    
            #region private methods
    
            private static void AddFolder2Zip(ZipOutputStream zip, DirectoryInfo di, string internalzippath)
            {
                string izp = internalzippath + di.Name + "/";    // A directory is determined by an entry name with a trailing slash "/"
                Crc32 crc = new Crc32();
                ZipEntry entry = new ZipEntry(izp);
                entry.Crc = crc.Value;
                zip.PutNextEntry(entry);
                foreach (FileInfo fi in di.GetFiles())
                    AddFile2Zip(zip, fi, izp);
                foreach (DirectoryInfo sdi in di.GetDirectories())
                    AddFolder2Zip(zip, sdi, izp);
            }
            private static void AddFile2Zip(ZipOutputStream zip, FileInfo fi, string internalzippath)
            {
                Crc32 crc = new Crc32();
                FileStream fs = File.OpenRead(fi.FullName);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(internalzippath + fi.Name);
                entry.DateTime = DateTime.Now;
                entry.Size = fs.Length;
                fs.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                zip.PutNextEntry(entry);
                zip.Write(buffer, 0, buffer.Length);
            }
    
            #endregion
        }
    }

    la paginetta di prova è:
    codice:
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="zip_and_download_un_file.aspx.vb" Inherits="CorsoApogeo_zip_SharpZiplib_zip_and_download_un_file" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Pagina senza titolo</title>
        <link href="../../../stili/Styles.css" rel="stylesheet" type="text/css" />
        <script type="text/javascript" src="../../../js/libreria.js"></script>
    <script language="javascript" type="text/javascript">
    <!--
    
    function Button2_onclick() 
    {
        $("span1").style.visibility = "visible";//Prego attendere...
        $("LinkButton1").style.display = "none";//link da premere se il donwload non dovesse partire
        ajax("?comando_ajax=1", onload, null, onerror);//comando al server di generare il file zip
        function onload()
        {
            $("span1").style.visibility = "hidden";//nascondo Prego attendere...
            var t = this.request.responseText;
            if(t == "ok")//se il file zip è generato senza errori...
            {
                $("LinkButton1").style.display = "";//rendo visibile il link da premere se il donwload non dovesse partire
                //$("LinkButton1").click();//comando al server di fare il download del file zip
                __doPostBack('LinkButton1','');
            }
        }
        function onerror()
        {//in caso di errore mostro il messaggio predefinito
            $("span1").style.visibility = "hidden";
            this.defaultError();
        }
    }
    
    // -->
    </script>
        
    </head>
    <body>
        <h3>zip un file e download</h3>
        <span>Viene creato uno zip di un file C:\dati\ProveNikon\3.tif, c:\tmp\zip.zip e viene fatto il download.</span>
        
    
    
    
        <form id="form1" runat="server">
            <div>
                <input id="Button2" type="button" value="Crea zip" language="javascript" onclick="return Button2_onclick()" />
                <span id="span1" style="visibility:hidden;">Prego attendere...</span>
                
    
                <asp:LinkButton ID="LinkButton1" runat="server" style="display:none;">Se il download non dovesse partire, fare click sul link</asp:LinkButton>
            </div>
        </form>
    </body>
    </html>
    il codice corrispondente è:
    codice:
    Option Strict On
    
    Partial Class CorsoApogeo_zip_SharpZiplib_zip_and_download_un_file
        Inherits System.Web.UI.Page
    
        Const ZipFilePath As String = "c:\tmp\zip.zip"
        Const OriginalFilePath As String = "C:\dati\ProveNikon\3.tif"
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim comando_ajax As String = RequestParams("comando_ajax")
            If comando_ajax = "1" Then
                CreaFileZip()
                Response.Write("ok")
                Response.End()
            End If
        End Sub
    
    
        Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
            SpedisciFile(ZipFilePath)
        End Sub
    
    
        Private Sub CreaFileZip()
            'Guru4Net.Zip.ZipFolder(ZipFilePath, OriginalFolderPath)
            Guru4Net.Zip.ZipFile(ZipFilePath, OriginalFilePath)
        End Sub
    
    
    
        Private Sub SpedisciFile(ByVal filePath As String)
    
            Response.Expires = -1
    
            ' verifica esistenza 
            Dim fi As FileInfo = New FileInfo(filePath)
            If fi.Exists Then
                ' imposta le headers 
                Response.Clear()
                Response.AddHeader("Content-Disposition", "attachment; filename=""" & fi.Name & """")
                Response.AddHeader("Content-Length", fi.Length.ToString())
                Response.ContentType = "application/octet-stream"
    
                ' leggo dal file e scrivo nello stream di risposta 
                Response.WriteFile(filePath)
    
                AggiornaLog("c:\tmp\log.txt", True)
    
                Response.End()
            Else
                Response.Write("Impossibile scaricare il file.")
            End If
    
        End Sub
    
    End Class
    Pietro

  3. #3
    Ciao luffa, forse quest'articolo ti può essere utile: http://www.dotnet2themax.it/ShowCont...3-3f6f984ec04c

    C'è spiegata passo passo in VB e in C# (ma a te serve il VB ) la procedura

  4. #4
    Consiglio anch'io la soluzione proposta da .net2themax in quanto usare la libreria per zippare grossi file, con l'array di Byte della lunghezza del file, genera enormi problemi su file grossi. Grow up RAM.

  5. #5
    Ragazzi ieri ho scritto anch'io un paio di righe sull'argomento e sull'ottimo oggetto. Ma oggi ho già smesso di ridere.

    Il file zip che viene creato non è perfetto. O meglio si apre con winzip (e simili) e i file singolarmente si estraggono, anche via drag'n'drop.

    Se però uso i comandi di estrazione automatica tipo "estrai qui" oppure "estra in 'xxxx'" mi da errore e più precisamente:
    ! C:\Documents and Settings\r.mares\Desktop\a0a705a2-06b0-4456-8e14-2b27ff66fd24.zip: Metodo sconosciuto in \xxx\cicciobello.xxx
    ! C:\Documents and Settings\r.mares\Desktop\a0a705a2-06b0-4456-8e14-2b27ff66fd24.zip: Nessun file da estrarre
    Dove "\xxx" è il path interno dello zip.

    L'inserimento dell'entre delle directory e dei file lo faccio così:
    ZipEntry entry = new ZipEntry(izp);
    dove izp è il path del file da inserire.

    Domanda: è necessario creare un ZipEntry anche per le cartelle?
    Grazie

  6. #6
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Puoi mettere il contenuto di izp ?? credo sia li il problema.

  7. #7
    izp è il path della cartella o del file. es.:
    - cartellaA/cartellaB/file.txt
    - cartellaA/cartellaC/ciccio.bat

    In ogni modo alla fine venerdì sono riuscito a renderlo compatibile con winzip e con 7zip, ma non con winrar. La soluzione è stata non fare lo zipEntry per le cartelle, ma solo per i file, con il path corretto.

    Spero di essere stato chiaro e grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.