net crear archivo c# list directory zip
clase ZipPackagehttp://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx

c# - crear - dot net zip



¿Cómo hacer una lista de los contenidos de una carpeta.zip en c#? (8)

Cómo hacer una lista de los contenidos de una carpeta comprimida en C #? Por ejemplo, cómo saber cuántos elementos están contenidos dentro de una carpeta comprimida y cuál es su nombre.


.NET 4.5 o posterior finalmente tiene capacidad incorporada para manejar archivos zip genéricos con la clase System.IO.Compression.ZipArchive ( http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx ) en el ensamblado System.IO.Compression. No hay necesidad de una biblioteca de terceros.

string zipPath = @"c:/example/start.zip"; using (ZipArchive archive = ZipFile.OpenRead(zipPath)) { foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine(entry.FullName); } }


Consulte en SharpZipLib

ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName)) While (isnStream.GetNextEntry) { entry = inStream.GetNextEntry(); //write out your entry''s filename }


Ick: ¡ese código que usa el tiempo de ejecución J # es horrible! Y no estoy de acuerdo en que sea la mejor manera: J # está fuera de soporte ahora. Y es un ENORME tiempo de ejecución, si todo lo que quieres es soporte ZIP.

¿Qué tal esto? Utiliza DotNetZip ( DotNetZip gratuita 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); } }


La mejor forma es utilizar .NET incorporado en la funcionalidad J # zip, como se muestra en MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspx . En este enlace hay un ejemplo completo de trabajo de lectura y escritura de una aplicación en archivos comprimidos. Para el ejemplo concreto de listar el contenido de un archivo zip (en este caso, un paquete de aplicaciones Silverlight .xap), el código podría verse así:

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 tenía un puntero a la derecha, pero hay problemas . Específicamente, puede encontrar problemas al abrir archivos zip, pero es una solución válida si solo desea crear pacakges. ZipPackage implementa la clase de paquete abstracto y permite la manipulación de archivos zip. Hay una muestra de cómo hacerlo en MSDN: http://msdn.microsoft.com/en-us/library/ms771414.aspx . Aproximadamente el código se vería así:

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); } } }

La mejor forma parece usar J #, como se muestra en MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspx

Hay punteros a más bibliotecas de c # .zip con diferentes licencias, como SharpNetZip y DotNetZip en este artículo: ¿cómo leer archivos de zip sin comprimir en c #? . Pueden ser inadecuados debido a los requisitos de la licencia.


Si eres como yo y no quieres usar un componente externo, aquí hay un código que desarrollé anoche usando la clase ZipPackage de .NET.

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)); } } }

Cosas a tener en cuenta:

  • El archivo ZIP DEBE tener un archivo [Content_Types] .xml en su raíz. Esto no fue un problema para mis requisitos, ya que controlaré el ajuste de cualquier archivo ZIP que se extraiga a través de este código. Para obtener más información sobre el archivo [Content_Types] .xml, consulte: Un nuevo estándar para empaquetar sus datos. Hay un archivo de ejemplo debajo de la figura 13 del artículo.

  • Este código utiliza el método Stream.CopyTo en .NET 4.0



Soy relativamente nuevo aquí, así que tal vez no entiendo lo que está pasando. :-) Actualmente hay 4 respuestas en este hilo donde las dos mejores respuestas han sido rechazadas. (Pearcewg y cxfx) El artículo señalado por pearcewg es importante porque aclara algunos problemas de licencia con SharpZipLib. Recientemente evaluamos varias bibliotecas de compresión .Net, y descubrimos que DotNetZip es actualmente el mejor aleternativo.

Resumen muy breve:

  • System.IO.Packaging es significativamente más lento que DotNetZip.

  • SharpZipLib es GPL - ver artículo.

Entonces, para empezar, voté esas dos respuestas.

Kim.


DotNetZip - Manipulación de archivos Zip en lenguajes .NET

DotNetZip es una biblioteca de clases pequeña y fácil de usar para manipular archivos .zip. Puede habilitar aplicaciones .NET escritas en VB.NET, C #, cualquier lenguaje .NET, para crear, leer y actualizar archivos zip fácilmente.

código de muestra para leer un zip:

using (var zip = ZipFile.Read(PathToZipFolder)) { int totalEntries = zip.Entries.Count; foreach (ZipEntry e in zip.Entries) { e.FileName ... e.CompressedSize ... e.LastModified... } }