У меня есть каталог, содержащий несколько файлов. Я хочу сжать эту папку в файл zip или tar.gz. Как я могу выполнять его работу на С#?
Как сжать каталог с .NET?
Ответ 1
Вы можете использовать DotNetZip Library. Он имеет довольно богатые и полезные функции.
EDIT:
string[] MainDirs = Directory.GetDirectories(DirString);
for (int i = 0; i < MainDirs.Length; i++)
{
using (ZipFile zip = new ZipFile())
{
zip.UseUnicodeAsNecessary = true;
zip.AddDirectory(MainDirs[i]);
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");
zip.Save(string.Format("test{0}.zip", i));
}
}
Ответ 2
Посмотрите на использование SharpZipLib. Он поддерживает сжатие GZip и ZIP в С#.
Здесь есть отличный учебник в котором описывается, что вам нужно сделать, чтобы закрепить каталог с помощью SharpZipLib.
Ответ 3
использовать 7zip из командной строки в С# → LZMA SDK поддерживает С#, и в пакете есть кодеки
Ответ 4
Я использую пространство имен System.IO.Packaging, которое было представлено в .NET Framework 3.5. Я решил использовать его, потому что он основан на базовых классах .NET Framework, и не требуется сторонний код, который взрывает размер кода.
здесь еще одна статья о Stackoverflow относительно этого вопроса
И здесь название и пространство ZipPackage/объяснение @MSDN
надеюсь, что поможет
Christian
Ответ 5
В моей предыдущей работе мы использовали # ziplib.
Ответ 6
Это хорошая дискуссия, в которой обсуждается возможность делать это без каких-либо сторонних библиотек. Я думаю, вам стоит взглянуть на это.
Вот большой репозиторий образцов кодов, которые могут помочь вам в вашей работе. Удачи..
Ответ 7
GZip является частью Microsoft Framework 2.0 и далее. Его называют GZipStream в пространстве имен System.IO.Compression.
Чтобы сжать каталог с этим классом, вам необходимо создать сериализуемый класс (например, каталог), который содержит коллекцию файлов.
Класс Files будет содержать имя файла и файловый поток для чтения байтов из файла. Как только вы примените GZip в Каталоге, он будет читать файлы один за другим и записывать их в GZipStream.
Проверьте эту ссылку: http://www.vwd-cms.com/forum/forums.aspx?topic=18
Ответ 8
Еще одна опция pre-3.5 - использовать утилиты zip из J #. В конце концов,.Net не волнует, на каком языке был изначально написан код: -).
Статьи о том, как это сделать:
Ответ 9
Вопрос довольно старый, и ответы тоже.
Лучший ответ с конца 2012 года: Использовать .NET 4.5 и содержащиеся классы пространства имен System.IO.Compression
и System.IO.Compression.ZipArchive
.
Один из многих примеров ссылок, которые вы получаете при поиске в Интернете: http://www.codeproject.com/Articles/381661/Creating-Zip-Files-Easily-in-NET
Начиная с 2014/2015 ff.: С Roslyn вся инфраструктурная библиотека была опубликована как Open Source, поэтому AFAI это понимает, вы можете извлечь код из классов 4.5 (так как это не должно быть специфично для системы) и использовать его как библиотеку для ранних .NET-фреймворков, Возможно, это даст некоторые преимущества лицензии по сравнению с другими классами, но это должно быть проанализировано вами.
Ответ 10
Вы можете архивировать каталог в чистом .NET 3.0.
Во-первых, вам понадобится ссылка на WindowsBase.dll.
Этот код откроет или создаст zip файл, создаст каталог внутри и поместит файл в этот каталог. Если вы хотите сжать папку, возможно, содержащую подкаталоги, вы можете перебрать файлы в каталоге и вызвать этот метод для каждого файла. Затем вы можете сначала выполнить поиск в подкаталогах файлов, вызвать метод для каждого из них и указать путь для создания этой иерархии в zip файле.
public void AddFileToZip(string zipFilename, string fileToAdd, string destDir)
{
using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
{
string destFilename = "." + destDir + "\\" + Path.GetFileName(fileToAdd);
Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
if (zip.PartExists(uri))
{
zip.DeletePart(uri);
}
PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);
using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
{
using (Stream dest = part.GetStream())
{
CopyStream(fileStream, dest);
}
}
}
}
destDir может быть пустой строкой, которая поместит файл прямо в zip.
https://weblogs.asp.net/albertpascual/creating-a-folder-inside-the-zip-file-with-system-io-packaging