Форматът 7z е популярен избор за компресия с високо съотношение и разпространение. С Aspose.ZIP for .NET, можете да създавате 7z архиви програмно, използвайки прост, модерен API. Това ръководство преминава през минимален работещ пример и добавя практични модели за реални проекти, като добавяне на файлове от диск, поточно предаване на данни от паметта, контролиране на имената на елементите и папките в архива, както и базова обработка на грешки.
Всички примерни кодове са вмъкнати и самостоятелни.
Предпоставки
- .NET 6 или по-нов
- NuGet пакет
Aspose.Zip
dotnet add package Aspose.Zip
Пространства от имена, използвани в примерите: Aspose.Zip, Aspose.Zip.SevenZip
Бърз старт: създайте 7z архив с няколко файла
Този минимален пример създава нов 7z архив в паметта, добавя два елемента и го записва на диска.
// File: Program.cs
using System;
using System.IO;
using System.Text;
using Aspose.Zip.SevenZip;
class Program
{
static void Main()
{
var outputPath = "example.7z";
using (var archive = new SevenZipArchive())
{
// Add a text file from memory
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello 7z from Aspose.ZIP")))
{
archive.CreateEntry("docs/readme.txt", ms);
}
// Add a file from disk
var sourceFile = "report.pdf"; // ensure this file exists
if (File.Exists(sourceFile))
{
using var fs = File.OpenRead(sourceFile);
archive.CreateEntry("reports/2025/report.pdf", fs);
}
// Save the 7z archive
using var outStream = File.Create(outputPath);
archive.Save(outStream);
}
Console.WriteLine("Saved 7z: " + Path.GetFullPath(outputPath));
}
}
Какво да се забележи
SevenZipArchiveзапочва празно, след което извикватеCreateEntry(entryName, stream)за всеки елемент.- Имената на елементите определят структурата на папките в архива, например
docs/readme.txt. - Можете да предадете всяко четимо
Stream, което е полезно за данни, които генерирате в паметта.
Добавете цялото дърво от папки
Обходете директория рекурсивно, запазете относителната й структура в archive, и запишете като .7z.
using System;
using System.IO;
using Aspose.Zip.SevenZip;
static class FolderTo7z
{
public static void CreateFromFolder(string sourceDir, string output7z)
{
if (!Directory.Exists(sourceDir))
throw new DirectoryNotFoundException(sourceDir);
using var archive = new SevenZipArchive();
var basePath = Path.GetFullPath(sourceDir);
foreach (var filePath in Directory.GetFiles(basePath, "*", SearchOption.AllDirectories))
{
var relPath = Path.GetRelativePath(basePath, filePath)
.Replace(Path.DirectorySeparatorChar, '/'); // normalize to forward slashes
using var fs = File.OpenRead(filePath);
archive.CreateEntry(relPath, fs);
}
using var outStream = File.Create(output7z);
archive.Save(outStream);
}
}
// Usage
// FolderTo7z.CreateFromFolder(@Path.Combine("C:", "data", "input"), "bundle.7z");
Съвети
- Използвайте
Path.GetRelativePathза да запазите вътрешната folder layout чиста. - Нормализирайте разделителите на пътищата към наклонени черти (/) за последователни елементи в архива.
Поточно предаване на големи файлове безопасно
При добавяне на големи файлове, stream-те ги вместо да буферирате целия файл в паметта. Основният шаблон по-горе с File.OpenRead вече stream-ва. Ако генерирате съдържание в движение, запишете го в Stream и предайте този stream директно на CreateEntry.
using System.IO;
using System.Text;
using Aspose.Zip.SevenZip;
static void AddGeneratedCsv(SevenZipArchive archive, string entryName)
{
// Example generator that writes CSV rows in a forward-only fashion
using var pipe = new MemoryStream();
using var writer = new StreamWriter(pipe, Encoding.UTF8, leaveOpen: true);
writer.WriteLine("id,name");
for (int i = 1; i <= 1000; i++)
writer.WriteLine($"{i},Item {i}");
writer.Flush();
pipe.Position = 0;
archive.CreateEntry(entryName, pipe);
}
Организирайте записите с помощник
За по‑големи задачи използвайте малък помощник за добавяне на файлове с общ префикс. Това прави структурата на архива предвидима.
using System.IO;
using Aspose.Zip.SevenZip;
static class SevenZipHelpers
{
public static void AddFile(SevenZipArchive archive, string rootPrefix, string fullPath)
{
var relName = Path.Combine(rootPrefix, Path.GetFileName(fullPath))
.Replace(Path.DirectorySeparatorChar, '/');
using var fs = File.OpenRead(fullPath);
archive.CreateEntry(relName, fs);
}
}
Пълен пример с логване и основни проверки
Този пример създава 7z архив от смесен списък с източници. Той валидира пътищата и записва резултатите в лог.
// File: BuildArchive.cs
using System;
using System.Collections.Generic;
using System.IO;
using Aspose.Zip.SevenZip;
public static class BuildArchive
{
public static bool Run(IEnumerable<string> paths, string output7z)
{
if (paths == null) throw new ArgumentNullException(nameof(paths));
Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(output7z)) ?? ".");
int added = 0, skipped = 0;
using var archive = new SevenZipArchive();
foreach (var p in paths)
{
if (string.IsNullOrWhiteSpace(p)) { skipped++; continue; }
if (File.Exists(p))
{
using var fs = File.OpenRead(p);
var entryName = Path.GetFileName(p);
archive.CreateEntry(entryName, fs);
Console.WriteLine("Added file: " + entryName);
added++;
}
else if (Directory.Exists(p))
{
var basePath = Path.GetFullPath(p);
foreach (var fp in Directory.GetFiles(basePath, "*", SearchOption.AllDirectories))
{
var rel = Path.GetRelativePath(basePath, fp).Replace(Path.DirectorySeparatorChar, '/');
using var fs = File.OpenRead(fp);
archive.CreateEntry(rel, fs);
Console.WriteLine("Added: " + rel);
added++;
}
}
else
{
Console.WriteLine("Skip missing: " + p);
skipped++;
}
}
using var outStream = File.Create(output7z);
archive.Save(outStream);
Console.WriteLine($"Saved: {Path.GetFullPath(output7z)}");
Console.WriteLine($"Entries added: {added}, skipped: {skipped}");
return added > 0;
}
}
// Usage sample:
// BuildArchive.Run(new [] { "README.md", "assets", "docs/spec.pdf" }, "release.7z");
Най‑добри практики
- Използвайте forward slashes за entry names Много инструменти показват пътищата по‑консистентен начин, когато записите използват
/като разделител. - Освобождавайте потоци Винаги обвийте файловите потоци в
usingблокове. Примерите по‑горе осигуряват чисто освобождаване. - Валидирайте входовете Проверете дали файловете съществуват, преди да ги добавите. Предоставяйте ясни записи за пропуснатите пътища.
- Поддържайте структурата на архива чиста Изберете име за кореновата папка в архива и се придържайте към него, например
app/илиpackage/. - Тествайте на целевите платформи Проверете дали вашият 7z се отваря правилно в инструментите, на които разчитат вашите потребители.
Резюме
Създадохте 7z архив програмено с Aspose.ZIP for .NET, добавихте файлове от диск и памет, запазихте чиста структура на папките и запазихте резултата в .7z. Използвайте тези модели за пакетиране на издания, пакети и експорти директно от вашите C# приложения.