[C#] ¿Cómo puedo ZIP un archivo en C #, sin API de terceros?



Answers

¿Cómo puedo programar (C #) ZIP un archivo (en Windows) sin utilizar ninguna biblioteca de terceros?

Si usa el Framework 4.5+, ahora están las clases ZipFile y ZipFile .

using (ZipArchive zip = ZipFile.Open("test.zip", ZipArchiveMode.Create))
{
    zip.CreateEntryFromFile(@"c:\something.txt", "data/path/something.txt");
}

Necesita agregar referencias a:

  • System.IO.Compression
  • System.IO.Compression.FileSystem

Para .NET Core targeting net46, necesita agregar dependencias para

  • System.IO.Compression
  • System.IO.Compression.ZipFile

Ejemplo project.json:

"dependencies": {
  "System.IO.Compression": "4.1.0",
  "System.IO.Compression.ZipFile": "4.0.1"
},

"frameworks": {
  "net46": {}
}

Para .NET Core 2.0, solo es necesario agregar una declaración de uso simple:

  • utilizando System.IO.Compression;
Question

Estoy bastante seguro de que esto no es un duplicado, así que tengan paciencia conmigo por solo un minuto.

¿Cómo puedo programar (C #) ZIP un archivo (en Windows) sin utilizar ninguna biblioteca de terceros? Necesito una llamada de Windows nativa o algo así; Realmente no me gusta la idea de comenzar un proceso, pero lo haré si es absolutamente necesario. Una llamada PInovke sería mucho mejor.

De lo contrario, permítame decirle lo que realmente estoy tratando de lograr: necesito la capacidad de permitir que un usuario descargue una colección de documentos en una sola solicitud. ¿Alguna idea sobre cómo lograr esto?




Para una aplicación .NET 2.0 utilicé SharpZipLib . Fácil de usar y de código abierto.




Basado en la respuesta de Simon McKenzie a esta pregunta , sugiero usar un par de métodos como este:

    public static void ZipFolder(string sourceFolder, string zipFile)
    {
        if (!System.IO.Directory.Exists(sourceFolder))
            throw new ArgumentException("sourceDirectory");

        byte[] zipHeader = new byte[] { 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

        using (System.IO.FileStream fs = System.IO.File.Create(zipFile))
        {
            fs.Write(zipHeader, 0, zipHeader.Length);
        }

        dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
        dynamic source = shellApplication.NameSpace(sourceFolder);
        dynamic destination = shellApplication.NameSpace(zipFile);

        destination.CopyHere(source.Items(), 20);
    }

    public static void UnzipFile(string zipFile, string targetFolder)
    {
        if (!System.IO.Directory.Exists(targetFolder))
            System.IO.Directory.CreateDirectory(targetFolder);

        dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
        dynamic compressedFolderContents = shellApplication.NameSpace(zipFile).Items;
        dynamic destinationFolder = shellApplication.NameSpace(targetFolder);

        destinationFolder.CopyHere(compressedFolderContents);
    }
}





Links