Как я могу перечислить содержимое архива в С#? Например, как узнать, сколько элементов содержится в заархивированной папке и как они называются?
Как я могу перечислить содержимое папки .zip в С#?
Ответ 1
DotNetZip - Обработка файлов Zip на языках .NET
DotNetZip - небольшая, простая в использовании библиотека классов для управления ZIP файлами. Это может позволить приложениям .NET, написанным на VB.NET, С#, любом языке .NET, легко создавать, читать и обновлять zip файлы.
пример кода для чтения zip:
using (var zip = ZipFile.Read(PathToZipFolder))
{
int totalEntries = zip.Entries.Count;
foreach (ZipEntry e in zip.Entries)
{
e.FileName ...
e.CompressedSize ...
e.LastModified...
}
}
Ответ 2
Наконец, в .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);
}
}
Ответ 3
Если вы используете .Net Framework 3.0 или новее, посмотрите System.IO.Packaging - пространство имен. Это позволит удалить вашу зависимость от внешней библиотеки.
В частности, проверьте класс ZipPackage.
Ответ 4
Проверьте в SharpZipLib
ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));
while (inStream.GetNextEntry())
{
ZipEntry entry = inStream.GetNextEntry();
//write out your entry filename
}
Ответ 5
Ick - этот код с использованием J # runtime является отвратительным! И я не согласен с тем, что это лучший способ - 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);
}
}
Ответ 6
Я относительно новый, поэтому, возможно, я не понимаю, что происходит.:-) На данный момент есть 4 ответа, в которых два лучших ответа были отклонены. (Pearcewg и cxfx's). Статья, на которую указывает pearcewg, важна, поскольку она разъясняет некоторые проблемы с лицензированием SharpZipLib. Недавно мы оценили несколько библиотек сжатия .Net и обнаружили, что DotNetZip в настоящее время является лучшим альтернативным.
Очень короткое резюме:
-
System.IO.Packaging значительно медленнее, чем DotNetZip.
-
SharpZipLib - это GPL - см. статью.
Итак, для начала я проголосовал за эти два ответа.
Ким.
Ответ 7
Если вы похожи на меня и не хотите использовать внешний компонент, вот какой код я разработал вчера вечером, используя класс .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 файлы любых ZIP файлов, которые будут извлечены через этот код. Для получения дополнительной информации о файле [Content_Types].xml обратитесь к: Новый стандарт для упаковки ваших данных Ниже приведен пример файла Рисунок 13 статьи.
-
Этот код использует метод Stream.CopyTo в .NET 4.0
Ответ 8
Существует множество библиотек для .NET, имеющих разные требования к лицензированию.
Вот вступительная статья по теме: Статья
Ответ 9
Лучший способ - использовать встроенную в J # zip функциональность .NET, как показано в 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...
}
}
У Aydsman был правильный указатель, но есть проблемы . В частности, вы можете обнаружить проблемы с открытием zip файлов, но это допустимое решение, если вы собираетесь создавать только pacakges. ZipPackage реализует абстрактный класс пакета и позволяет манипулировать 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 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
Есть указатели на больше библиотек С#.zip с различными лицензиями, такими как SharpNetZip и DotNetZip в этой статье: как читать файлы из несжатого zip в С#?. Они могут быть непригодными из-за требований лицензии.