Я опинився в тій самій ситуації, хотів .NET замість сторонньої бібліотеки. Як ще один плакат, згаданий вище, просто використання класу ZipPackage (введеного в .NET 3.5) недостатньо. Є додатковий файл, який ОБОВ'ЯЗКОВО бути включений до архіву, щоб ZipPackage працював. Якщо цей файл доданий, отриманий пакет ZIP можна відкрити безпосередньо з Провідника Windows - не проблема.
Все, що вам потрібно зробити, - це додати файл [Content_Types] .xml до кореня архіву з вузлом «За замовчуванням» для кожного розширення, яке ви хочете включити. Після додавання я міг переглядати пакунок із Провідника Windows або програматично розпаковувати та читати його вміст.
Більше інформації про файл [Content_Types] .xml можна знайти тут: http://msdn.microsoft.com/en-us/magazine/cc163372.aspx
Ось зразок файлу [Content_Types] .xml (повинен бути названий точно):
<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns=
"http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="xml" ContentType="text/xml" />
<Default Extension="htm" ContentType="text/html" />
<Default Extension="html" ContentType="text/html" />
<Default Extension="rels" ContentType=
"application/vnd.openxmlformats-package.relationships+xml" />
<Default Extension="jpg" ContentType="image/jpeg" />
<Default Extension="png" ContentType="image/png" />
<Default Extension="css" ContentType="text/css" />
</Types>
І C # для створення ZIP-файлу:
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));
}
}
}
Примітка: