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