




Отметьте SharpZipLib
ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));
while (inStream.GetNextEntry())
{
ZipEntry entry = inStream.GetNextEntry();
//write out your entry's filename
}
DotNetZip - Работа с Zip-файлами на языках .NET.
DotNetZip - это небольшая, простая в использовании библиотека классов для управления файлами .zip. Он может позволить приложениям .NET, написанным на VB.NET, C#, любом языке .NET, легко создавать, читать и обновлять zip-файлы.
пример кода для чтения почтового индекса:
using (var zip = ZipFile.Read(PathToZipFolder))
{
int totalEntries = zip.Entries.Count;
foreach (ZipEntry e in zip.Entries)
{
e.FileName ...
e.CompressedSize ...
e.LastModified...
}
}
Если вы используете .Net Framework 3.0 или новее, ознакомьтесь с файлом System.IO.Packaging пространство имен. Это избавит вас от зависимости от внешней библиотеки.
В частности, обратите внимание на ZipPackage Класс.
Он устраняет зависимость от внешней библиотеки, но удобство использования ZipPackage действительно не очень хорошее. Все - компромисс!
ZipPackage предназначен для обработки в основном тех форматов файлов, связанных с Microsoft, которые внутри являются zip-файлами, например: docx, xlsx, XPS, nupkg .... С точки зрения обычного zip-файла они отличаются только из-за наличия файла Content_Type.xml, помещенного в корень архива. Если вы не можете использовать .NET 4.5, но можете использовать .NET 3.0, ZipPackage может быть идеальным, учитывая, что вы производите и потребляете файлы.
Для .NET 4.5 или более поздней версии следует использовать класс ZipArchive для общих целей zip, см. Мой ответ ниже
Я здесь относительно новичок, так что, возможно, я не понимаю, что происходит. :-) В настоящее время в этой теме есть 4 ответа, в которых два лучших ответа были отклонены. (Pearcewg's и cxfx's) Статья, на которую указывает pearcewg, важна, поскольку она разъясняет некоторые вопросы лицензирования SharpZipLib. Недавно мы оценили несколько библиотек сжатия .Net и обнаружили, что DotNetZip в настоящее время является лучшей альтернативой.
Очень краткое резюме:
System.IO.Packaging значительно медленнее, чем DotNetZip.
SharpZipLib - это GPL - см. Статью.
Итак, для начала, я проголосовал за эти два ответа.
Ким.
Сама GPL специально решает проблему частей программы, которые не являются «производными» от кода под GPL, и их права на независимое лицензирование. Я не понимаю, насколько серьезной проблемой является SharpZipLib, являющийся лицензией GPL.
GC, вы говорите, что если у группы или организации есть проблема с GPL, то группа ошибается? Или вы просто не можете понять, как у кого-то могут возникнуть проблемы с GPL? В это не так уж и сложно поверить. Пресса изобилует рассказами о дорогостоящих юридических проверках.
Да, GPL вирусна. Если он создает коммерческое программное обеспечение с закрытым исходным кодом и связывает свой код с библиотекой под GPL, то он должен выпустить свой исходный код под лицензией, совместимой с GPL. Так что да, тот факт, что SharpZibLib является лицензией GPL, является серьезной проблемой.
Этот пост: комментарий к другим ответам; обсуждение лицензирования (важно в любом контексте, но не только здесь и не имеет отношения к вопросу); запись о том, как вы проголосовали; и некоторые рекомендации библиотеки. Чем не является: ответ на вопрос «Как вывести список содержимого папки .zip в C#?».
Лучше всего использовать .NET, встроенный в функциональность J # zip, как показано в MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspx. По этой ссылке приведен полный рабочий пример приложения для чтения и записи в zip-файлы. Для конкретного примера перечисления содержимого zip-файла (в данном случае пакета приложения Silverlight .xap) код может выглядеть следующим образом:
ZipFile package = new ZipFile(packagePath);
java.util.Enumeration entries = package.entries();
//We have to use Java enumerators because we
//use java.util.zip for reading the .zip files
while ( entries.hasMoreElements() )
{
ZipEntry entry = (ZipEntry) entries.nextElement();
if (!entry.isDirectory())
{
string name = entry.getName();
Console.WriteLine("File: " + name + ", size: " + entry.getSize() + ", compressed size: " + entry.getCompressedSize());
}
else
{
// Handle directories...
}
}
У Айдсмана был правый указатель, но есть проблемы. В частности, вы можете столкнуться с проблемами при открытии zip-файлов, но это допустимое решение, если вы собираетесь создавать пакеты с помощью Только. ZipPackage реализует абстрактный класс Package и позволяет манипулировать zip-файлами. В MSDN есть пример того, как это сделать: http://msdn.microsoft.com/en-us/library/ms771414.aspx. Примерно код будет выглядеть так:
string packageRelationshipType = @"http://schemas.microsoft.com/opc/2006/sample/document";
string resourceRelationshipType = @"http://schemas.microsoft.com/opc/2006/sample/required-resource";
// Open the Package.
// ('using' statement insures that 'package' is
// closed and disposed when it goes out of scope.)
foreach (string packagePath in downloadedFiles)
{
Logger.Warning("Analyzing " + packagePath);
using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.Read))
{
Logger.OutPut("package opened");
PackagePart documentPart = null;
PackagePart resourcePart = null;
// Get the Package Relationships and look for
// the Document part based on the RelationshipType
Uri uriDocumentTarget = null;
foreach (PackageRelationship relationship in
package.GetRelationshipsByType(packageRelationshipType))
{
// Resolve the Relationship Target Uri
// so the Document Part can be retrieved.
uriDocumentTarget = PackUriHelper.ResolvePartUri(
new Uri("/", UriKind.Relative), relationship.TargetUri);
// Open the Document Part, write the contents to a file.
documentPart = package.GetPart(uriDocumentTarget);
//ExtractPart(documentPart, targetDirectory);
string stringPart = documentPart.Uri.ToString().TrimStart('/');
Logger.OutPut(" Got: " + stringPart);
}
// Get the Document part's Relationships,
// and look for required resources.
Uri uriResourceTarget = null;
foreach (PackageRelationship relationship in
documentPart.GetRelationshipsByType(
resourceRelationshipType))
{
// Resolve the Relationship Target Uri
// so the Resource Part can be retrieved.
uriResourceTarget = PackUriHelper.ResolvePartUri(
documentPart.Uri, relationship.TargetUri);
// Open the Resource Part and write the contents to a file.
resourcePart = package.GetPart(uriResourceTarget);
//ExtractPart(resourcePart, targetDirectory);
string stringPart = resourcePart.Uri.ToString().TrimStart('/');
Logger.OutPut(" Got: " + stringPart);
}
}
}
Лучше всего использовать J #, как показано в MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspx
В этой статье есть указатели на другие библиотеки C# .zip с разными лицензиями, например SharpNetZip и DotNetZip: как читать файлы из несжатого zip в с #?. Они могут быть неподходящими из-за лицензионных требований.
нет, это не самое лучшее. Среда выполнения J # основана на старой библиотеке Java, в архиве есть ошибки, и он больше не поддерживается.
Крик - этот код, использующий среду выполнения J #, ужасен! И я не согласен, что это лучший способ - J # сейчас не поддерживается. И это ОГРОМНАЯ среда выполнения, если все, что вам нужно, - это поддержка ZIP.
Как насчет этого - он использует DotNetZip (бесплатная, MS-Public лицензия)
using (ZipFile zip = ZipFile.Read(zipfile) )
{
bool header = true;
foreach (ZipEntry e in zip)
{
if (header)
{
System.Console.WriteLine("Zipfile: {0}", zip.Name);
if ((zip.Comment != null) && (zip.Comment != ""))
System.Console.WriteLine("Comment: {0}", zip.Comment);
System.Console.WriteLine("\n{1,-22} {2,9} {3,5} {4,9} {5,3} {6,8} {0}",
"Filename", "Modified", "Size", "Ratio", "Packed", "pw?", "CRC");
System.Console.WriteLine(new System.String('-', 80));
header = false;
}
System.Console.WriteLine("{1,-22} {2,9} {3,5:F0}% {4,9} {5,3} {6:X8} {0}",
e.FileName,
e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
e.UncompressedSize,
e.CompressionRatio,
e.CompressedSize,
(e.UsesEncryption) ? "Y" : "N",
e.Crc32);
if ((e.Comment != null) && (e.Comment != ""))
System.Console.WriteLine(" Comment: {0}", e.Comment);
}
}
Если вы похожи на меня и не хотите использовать внешний компонент, вот код, который я разработал вчера вечером с использованием класса .NET ZipPackage.
var zipFilePath = "c:\\myfile.zip";
var tempFolderPath = "c:\\unzipped";
using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
foreach (PackagePart part in package.GetParts())
{
var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
var targetDir = target.Remove(target.LastIndexOf('\\'));
if (!Directory.Exists(targetDir))
Directory.CreateDirectory(targetDir);
using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
{
source.CopyTo(File.OpenWrite(target));
}
}
}
На заметку:
ZIP-архив ДОЛЖЕН иметь в корне файл [Content_Types] .xml. Это не было проблемой для моих требований, так как я буду контролировать архивирование любых ZIP-файлов, извлекаемых с помощью этого кода. Для получения дополнительной информации о файле [Content_Types] .xml, пожалуйста, обратитесь к: Новый стандарт упаковки ваших данных Ниже на Рисунке 13 этой статьи есть пример файла.
Этот код использует метод Stream.CopyTo в .NET 4.0.
Какой месяц и год для Журнал МДСН? msdn.microsoft.com/en-us/magazine/ee310108.aspx
.NET 4.5 или новее, наконец, имеет встроенную возможность обрабатывать общие zip-файлы с классом System.IO.Compression.ZipArchive (http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx) в сборке System.IO.Compression. Нет необходимости в сторонней библиотеке.
string zipPath = @"c:\example\start.zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
Console.WriteLine(entry.FullName);
}
}
Прекрасно работает сразу после установки без сторонних компонентов. Обязательно добавьте ссылки System.IO.Compression.dll и System.IO.Compression.FileSystem.dll.
В случае .NET 4.5 или новее вам больше не нужна сторонняя библиотека! Смотрите мой ответ ниже!