J'aime compresser plusieurs fichiers qui sont créés dynamiquement dans mon application Web. Ces fichiers doivent être zippés. Pour cela, je ne veux utiliser aucun outil tiers. tout comme pour utiliser .net api en c #
Utilisez System.IO.Packaging dans .NET 3.0 + .
Voir cette introduction à System.IO.Packaging
Si vous êtes capable de prendre une dépendance .NET 4.5, il y a System.IO.Compression.ZipArchive dans cet univers; voir article pas à pas ici ( via l'article de synthèse des actualités InfoQ ici )
Avec la sortie du .NET Framework 4.5, cela est en fait beaucoup plus facile maintenant avec les mises à jour de System.IO.Compression qui ajoute le classe ZipFile . Il y a un bon walk-through sur codegur ; cependant, les bases sont conformes à l'exemple suivant:
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.IO.Compression.FileSystem;
namespace ZipFileCreator
{
public static class ZipFileCreator
{
/// <summary>
/// Create a Zip file of the files provided.
/// </summary>
/// <param name="fileName">The full path and name to store the Zip file at.</param>
/// <param name="files">The list of files to be added.</param>
public static void CreateZipFile(string fileName, IEnumerable<string> files)
{
// Create and open a new Zip file
var Zip = ZipFile.Open(fileName, ZipArchiveMode.Create);
foreach (var file in files)
{
// Add the entry for each file
Zip.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
}
// Dispose of the object when we are done
Zip.Dispose();
}
}
}
Je ne suis pas sûr de ce que vous entendez par ne pas vouloir utiliser des outils tiers, mais je suppose que vous ne voulez pas qu'une mauvaise opération le fasse par programme via un autre logiciel.
Je recommande d'utiliser ICSharpCode SharpZipLib
Cela peut être ajouté à votre projet comme référence DLL et est assez simple pour créer des fichiers Zip et les lire.
http://www.codeplex.com/DotNetZip Les codes sources sont disponibles, vous pouvez donc voir comment ils le font et écrire quelque chose de similaire pour vous-même
Fichier Zip simple avec structure plate:
using System.IO;
using System.IO.Compression;
private static void CreateZipFile(IEnumerable<FileInfo> files, string archiveName)
{
using (var stream = File.OpenWrite(archiveName))
using (ZipArchive archive = new ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Create))
{
foreach (var item in files)
{
archive.CreateEntryFromFile(item.FullName, item.Name, CompressionLevel.Optimal);
}
}
}
Vous devez ajouter une référence à System.IO.Compression et System.IO.Compression.FileSystem
Eh bien, vous pouvez compresser les fichiers en utilisant la fonction suivante, vous devez simplement passer les octets de fichier et cette fonction compressera les octets de fichier passés en paramètre et retournera les octets de fichier compressés.
public static byte[] PackageDocsAsZip(byte[] fileBytesTobeZipped, string packageFileName)
{
try
{
string parentSourceLoc2Zip = @"C:\\\\UploadedDocs"\SG-ACA OCI Packages";
if (Directory.Exists(parentSourceLoc2Zip) == false)
{
Directory.CreateDirectory(parentSourceLoc2Zip);
}
//if destination folder already exists then delete it
string sourceLoc2Zip = string.Format(@"{0}\{1}", parentSourceLoc2Zip, packageFileName);
if (Directory.Exists(sourceLoc2Zip) == true)
{
Directory.Delete(sourceLoc2Zip, true);
}
Directory.CreateDirectory(sourceLoc2Zip);
FilePath = string.Format(@"{0}\{1}",
sourceLoc2Zip,
"filename.extension");//e-g report.xlsx , report.docx according to exported file
File.WriteAllBytes(FilePath, fileBytesTobeZipped);
//if Zip already exists then delete it
if (File.Exists(sourceLoc2Zip + ".Zip"))
{
File.Delete(sourceLoc2Zip + ".Zip");
}
//now Zip the source location
ZipFile.CreateFromDirectory(sourceLoc2Zip, sourceLoc2Zip + ".Zip", System.IO.Compression.CompressionLevel.Optimal, true);
return File.ReadAllBytes(sourceLoc2Zip + ".Zip");
}
catch
{
throw;
}
}
Maintenant, si vous souhaitez exporter ces octets Zip créés pour que l'utilisateur puisse les télécharger, vous pouvez appeler cette fonction en utilisant les lignes suivantes
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=Report.Zip");
Response.ContentType = "application/Zip";
Response.BinaryWrite(PackageDocsAsZip(fileBytesToBeExported ,"TemporaryFolderName"));
Response.End();
DotNetZip est la voie à suivre (dotnetzip.codeplex.com) ... n'essayez pas la bibliothèque d'empaquetage .NET .. trop difficile à utiliser et le [Content_Types] .xml qu'il y met me dérange ..
Consultez System.IO.Compression.DeflateStream. Vous trouverez quelques exemples sur msdn http://msdn.Microsoft.com/en-us/library/system.io.compression.deflatestream.aspx
Vous pouvez toujours appeler un exécutable tiers comme 7-Zip avec une ligne de commande appropriée à l'aide de la classe System.Diagnostics.Process. Il n'y a pas d'interopérabilité de cette façon, car vous demandez simplement au système d'exploitation de lancer un binaire.