Мне нравится архивировать несколько файлов, которые динамически создаются в моем веб-приложении. Эти файлы должны быть заархивированы. Для этого я не хочу использовать какие-либо сторонние инструменты. так же, как использовать .net API в С#
Как заархивировать несколько файлов, используя только .net api в С#
Ответы (8)
С выпуском .NET Framework 4.5 это стало намного проще благодаря обновлениям System.IO.Compression, который добавляет файл класс ZipFile. Существует хорошее пошаговое руководство по кодгуру; однако основы соответствуют следующему примеру:
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();
}
}
}
IEnumerable<string> files
- person Kris Coleman; 21.09.2017
foreach
var entry = zip.CreateEntry(file), CompressionLevel.Optimal); using (Stream dbStream = getStreamFromDB(file)) using (Stream entryStream = entry.Open()) { dbStream.CopyToAsync(entryStream); }
- person sirdank; 07.03.2019
Используйте System.IO.Packaging в .NET 3.0+. а>.
См. это введение в System.IO.Packaging
Если вы можете использовать зависимость от .NET 4.5, есть System.IO.Compression.ZipArchive в этом юниверсе; см. пошаговое руководство статья здесь (через сводку новостей InfoQ здесь)
Простой zip-файл с плоской структурой:
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);
}
}
}
Вам нужно добавить ссылку на System.IO.Compression и System.IO.Compression.FileSystem.
Я не уверен, что вы имеете в виду, не желая использовать сторонние инструменты, но я предполагаю, что вы не хотите, чтобы какое-то неприятное взаимодействие программно выполняло это через другое программное обеспечение.
Я рекомендую использовать ICSharpCode SharpZipLib.
Это может быть добавлено в ваш проект в качестве эталонной DLL, и это довольно просто для создания ZIP-файлов и их чтения.
Ну, вы можете заархивировать файлы, используя следующую функцию, вам нужно просто передать байты файла, и эта функция заархивирует байты файла, переданные в качестве параметра, и вернет байты заархивированного файла.
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;
}
}
Теперь, если вы хотите экспортировать эти zip-байты, созданные для загрузки пользователем, вы можете вызвать эту функцию, используя следующие строки:
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=Report.zip");
Response.ContentType = "application/zip";
Response.BinaryWrite(PackageDocsAsZip(fileBytesToBeExported ,"TemporaryFolderName"));
Response.End();
Вы всегда можете вызвать сторонний исполняемый файл, такой как 7-zip, с соответствующей командной строкой, используя класс System.Diagnostics.Process. Таким образом, нет взаимодействия, потому что вы просто просите ОС запустить двоичный файл.
DotNetZip - это то, что нужно (dotnetzip.codeplex.com) ... не пытайтесь использовать библиотеку .NET Packaging ... слишком сложную в использовании, и меня беспокоит [Content_Types].xml, который она туда помещает.
Ознакомьтесь с System.IO.Compression.DeflateStream. Связанная страница документации также предлагает пример.