Introduction
Have you ever encountered a scenario when you have to download a few files zipped and compressed? Few developments involving the manipulation of documents and its management would require this. There are a lot of packages out in the market. Here, in this article, I would be sharing the use of
the DotNetZip package used to zip, unzip & compress files using C#, VB.NET, & any .NET language.
Practicality
Download the DotNetzip package from the NuGet package.
Download from here.
Once downloaded, it's all set to use the DotNetzip package to start zipping the files and compressing them. For the files to be zipped, here I will be using the file path and select each file to be zipped. Here also, we will see how a file is created on the fly (a PDF using Rotativa) is saved in the same folder and zipped.
File created on the fly using Rotativa
- var pdfResult = new Rotativa.PartialViewAsPdf("~/Template.cshtml", model)
- {
- FileName = "Template.pdf"
- };
- var resultSet = pdfResult.BuildPdf(ControllerContext);
- if (resultSet != null) {
- string path = Path.Combine(Server.MapPath(subPath));
- FileStream fs = new FileStream(path + ".pdf", FileMode.Create, FileAccess.ReadWrite);
- BinaryWriter bw = new BinaryWriter(fs);
- bw.Write(resultSet);
- bw.Close();
- }
The above code snippet is generating a PDF using a cshtml Razor View page using Rotativa
Using Rotativa Best to follow the mentioned article for more information to generate PDF using Rotativa using MVC. Let's look at the code snippet for zipping.
- using(ZipFile zipFile = new ZipFile()) {
-
- String[] files = Directory.GetFiles(Server.MapPath("/"));
- string fileUniqueName = "Template"
- foreach(string file in files) {
- if (file.Contains(fileUniqueName.ToString())) {
- zipFile.AddFile(file, @ "TemplateDocs_" + DateTime.Now);
-
- }
- }
- Response.ClearContent();
- Response.ClearHeaders();
-
- Response.AppendHeader("content-disposition", "attachment; filename=TemplatedDocuments.zip");
- zipFile.CompressionMethod = CompressionMethod.BZip2;
- zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
-
- zipFile.Save(outputStream);
- }
-
- outputStream.Position = 0;
- String[] filesToDelete = Directory.GetFiles(Server.MapPath("/"));
- foreach(string file in filesToDelete) {
- if (file.Contains(fileUniqueName.ToString())) {
- FileInfo fi = new FileInfo(file);
- fi.Delete();
- }
- }
- return new FileStreamResult(outputStream, fileType);
The above snippet is just required to start zipping and compressing the files. As you can see using block for the ZipFile is created with instantiation of its object.
Then, the files present under the path are navigated using Server.MapPath(""), Once the path is set, the files if with some unique string character in the filename needs to be searched and only zipped, is set to a variable.
Then each file is looped through and added to the ZipFile object, here zipFile.AddFiles(file, ZippedFolderName); ZipFolderName here is the name you set for the folder having all the files after extraction.
There are three compression levels for the ZipFile an enum which describes through code as below,
-
-
-
-
-
-
-
-
- public enum CompressionMethod {
-
-
-
- None = 0,
-
-
-
-
-
- Deflate = 8,
-
-
-
-
- BZip2 = 12
- }
The above are the three algorithms used. I personally have used only BZip2 based on few good reviews.
Once compressed and all files inserted into the folder, the zipped folder is ready to be downloaded using the FileStreamResult in MVC action.
Conclusion
This is the simple explanation and the code snippet for the Zip file concept. This is simple and really handy to be used and it also provides the compression algorithms which are good to go with.