ZIP: n luominen muistiin on hyödyllistä, kun sinun on suoritettava lataus, siirrettävä bytejä toiseen palveluun tai tallennettava arkisto tietokannassa ilman kosketuslevyä. Aspose.ZIP for .NET esittää puhdas API, joka luo Zip-tiedostoja käyttämällä virtoja, valitse kompressiasetukset ja tallentaa tuloksen MemoryStream
tai suoraan HTTP-vastaukseen.
Tämä opas tarjoaa täydellisen, oikean koodin, jonka voit laittaa konsoli-sovellukseen tai ASP.NET Core -hankkeeseen.
edellytykset
- .NET 6 tai uudempi
- Ja nyt:
Aspose.Zip
dotnet add package Aspose.Zip
Käytetyt nimikkeet:
using Aspose.Zip; // Archive, ArchiveEntry
using Aspose.Zip.Saving; // DeflateCompressionSettings, CompressionLevel
Nopea käynnistys: luo ZIP kokonaan muistiin
Tämä esimerkki lisää kirjoituksia sarjasta ja tiedostoa levylle, tallentaa arkiston MemoryStream
ja paljastaa tuloksena oleva byte array.
// File: Program.cs
using System;
using System.IO;
using System.Text;
using Aspose.Zip;
using Aspose.Zip.Saving;
class Program
{
static void Main()
{
// Prepare output buffer
using var zipBuffer = new MemoryStream();
// Choose compression (Deflate is the standard ZIP method)
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var entrySettings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
// 1) Add a text file from memory
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello from Aspose.ZIP in memory.")))
{
archive.CreateEntry("docs/readme.txt", ms, entrySettings);
}
// 2) Add a file from disk (streamed; not fully loaded in RAM)
var sourcePath = "report.pdf"; // ensure it exists
if (File.Exists(sourcePath))
{
using var fs = File.OpenRead(sourcePath);
archive.CreateEntry("reports/2025/report.pdf", fs, entrySettings);
}
// 3) Save the ZIP to our in-memory buffer
archive.Save(zipBuffer);
}
// Use the ZIP bytes as needed (send over network, write to DB, etc.)
byte[] zipBytes = zipBuffer.ToArray();
Console.WriteLine($"ZIP size: {zipBytes.Length} bytes");
}
}
- avainpisteitä *
new Archive()
Luo tyhjä zip.CreateEntry(entryName, stream, entrySettings)
lisätään tiedosto jokainen luettavissa oleva virta.archive.Save(stream)
kirjoittaa arkiston valitsemaasi virta (muisti, verkko, vastaus elimistö).
Lisää koko kansi puu kirjoittamatta temp tiedostoja
Kävely luetteloa uudelleen, säilytä suhteelliset reitit ja kirjoita lopullinen arkisto muistiin.
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static class InMemoryZipper
{
public static byte[] ZipFolderToBytes(string sourceFolder, CompressionLevel level = CompressionLevel.Normal)
{
if (!Directory.Exists(sourceFolder))
throw new DirectoryNotFoundException(sourceFolder);
var deflate = new DeflateCompressionSettings(level);
var entrySettings = new ArchiveEntrySettings(deflate);
using var buffer = new MemoryStream();
using (var archive = new Archive())
{
var root = Path.GetFullPath(sourceFolder);
foreach (var filePath in Directory.GetFiles(root, "*", SearchOption.AllDirectories))
{
var rel = Path.GetRelativePath(root, filePath).Replace(Path.DirectorySeparatorChar, '/');
using var fs = File.OpenRead(filePath);
archive.CreateEntry(rel, fs, entrySettings);
}
archive.Save(buffer);
}
return buffer.ToArray();
}
}
ASP.NET Core: ZIP lataus ilman I/O-levyä
Tämä loppupiste rakentaa ZIP: n muistiin useista lähteistä ja palauttaa sen oikealla sisällön tyypin ja latauksen tiedostonimen kanssa.
// File: Program.cs (minimal API)
using System.Text;
using Aspose.Zip;
using Aspose.Zip.Saving;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/download-zip", () =>
{
using var buffer = new MemoryStream();
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var settings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
// Add dynamic content (for example, a CSV generated on the fly)
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("id,name\n1,Alice\n2,Bob\n")))
archive.CreateEntry("data/users.csv", ms, settings);
// Add a static file from disk if available
var logo = "wwwroot/logo.png";
if (File.Exists(logo))
{
using var fs = File.OpenRead(logo);
archive.CreateEntry("assets/logo.png", fs, settings);
}
archive.Save(buffer);
}
buffer.Position = 0; // rewind for reading
return Results.File(
fileContents: buffer.ToArray(),
contentType: "application/zip",
fileDownloadName: $"bundle-{DateTime.UtcNow:yyyyMMdd-HHmmss}.zip");
});
app.Run();
- Miksi tuolla (miksi) täällä? *Minimaaliset APIs vaativat konkreettista maksua. erittäin suurille arkistoille, mieluummin suoratoistaminen suoraan
HttpResponse.Body
:
app.MapGet("/stream-zip", async (HttpContext ctx) =>
{
ctx.Response.ContentType = "application/zip";
ctx.Response.Headers.ContentDisposition = $"attachment; filename=\"bundle.zip\"";
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var settings = new ArchiveEntrySettings(deflate);
using var archive = new Archive();
// Add entries...
using var ms = new MemoryStream(Encoding.UTF8.GetBytes("hello"));
archive.CreateEntry("hello.txt", ms, settings);
// Stream directly to the client without buffering full ZIP in RAM
await archive.SaveAsync(ctx.Response.Body);
});
Valitse kompression asetukset
DeflateCompressionSettings
nopeus vs koko:
var fastest = new DeflateCompressionSettings(CompressionLevel.Low); // fastest, larger files
var balanced = new DeflateCompressionSettings(CompressionLevel.Normal); // default balance
var smallest = new DeflateCompressionSettings(CompressionLevel.High); // slowest, smallest files
Siirrä asetukset kautta new ArchiveEntrySettings(deflate)
Voit sekoittaa asetukset jokaiseen sisäänkäyntiin tarvittaessa.
Lisää sisäänkäyntejä virtauksista turvallisesti
- Käytä
File.OpenRead(path)
suoratoistaa suuria tiedostoja lataamatta niitä kokonaan muistiin. - Tuotetun sisällön osalta kirjoita a
MemoryStream
tai aPipeWriter
- tukee virtaa ja siirtää senCreateEntry
. - Käytettävissä virrat jokaisen
CreateEntry
Vapaa resurssi nopeasti.
Esimerkki suuresta tuotetusta sisällöstä:
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static void AddLargeGeneratedEntry(Archive archive, string name)
{
// simulate a big stream produced incrementally
using var temp = new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, FileOptions.DeleteOnClose);
using var writer = new StreamWriter(temp);
for (int i = 0; i < 200_000; i++) writer.WriteLine($"row-{i},value-{i}");
writer.Flush();
temp.Position = 0;
var settings = new ArchiveEntrySettings(new DeflateCompressionSettings(CompressionLevel.Normal));
archive.CreateEntry(name, temp, settings);
}
Validointi ja virheen käsittely
- Tarkista sisällöt olemassa ennen arkistoon lisäämistä.
- Luominen sisällä
try/catch
ja palauttaa selkeän HTTP-virheen web-API:lle. - Käytäntöönpanoja on käytetty edistyksellisillä matkoilla (
/
johdonmukaista käyttäytymistä eri työkaluissa.
suorituskyvyn tarkistus
- Choose
CompressionLevel.Low
reaaliaikaisia latauksia, kun nopeus on tärkeämpää kuin koko. - Vältä ladata massiivisia sisäänkäyntejä kokonaan RAM: ssä; virtaa tiedostoista tai verkkovirtoista.
- Erittäin suurille multi-GB-tiedostoille, virtaa suoraan
HttpResponse.Body
tai toinen kohdevirta sen sijaan, että buffering. - Dispose
Archive
Ja kaikki sisäänkäynti virtaa määräämättömästi.
FAQ
** Voinko suojata salasanan muistiinpanoon?**Aspose.ZIP tukee salattuja ZIP arkistoja. TraditionalEncryptionSettings
tai AesEncryptionSettings
kautta ArchiveEntrySettings
Hakeminen sisäänkäynnissä, kun soittaa CreateEntry
.
** Voinko päivittää olemassa olevan ZIP: n, jonka ladasin muistiin?**Laita se johonkin Archive
Lisää tai poista kirjoitukset, ja sitten Save
Takaisin virtaan.
**Tämä toimii Azure App -palvelussa tai säiliöissä?**Kyllä. muisti ja virrattu zipping toimii hyvin hiekkakoneissa ympäristöissä, joissa levyn pääsy on rajallinen.
Yhteenveto
Luot ZIP-tiedoston ** kokonaan muistiin** kanssa Aspose.ZIP for .NET, lisätään tuloksia virtauksista, säädetään kompressiosta ja palautat tiedoston lopullisesta kohdasta ASP.NET Core ilman väliaikaisia tiedostoja.
More in this category
- Luo 7z Arkistoja C#: ssä Aspose.ZIP:llä
- Luo tasapainoinen ZIP-arkisto C#-sovelluksessa Jäähdytettyjen ZIP:ien poisto Tehokkaasti
- Luo 7z (7-Zip) Arkistot Ohjelmistolla C# .NET
- Lisää tiedostoja tai tiedostoja ZIP-tiedostoihin ohjelmattisesti C#: ssä#
- Poista RAR-tiedostoja C#:ssä Unrar RAR Archives Tehokkaasti