J'ai été dans la même situation, de le vouloir .NET au lieu d'un tiers de la bibliothèque. Comme une autre affiche mentionné ci-dessus, simplement à l'aide de la ZipPackage classe (introduit en .NET 3.5) n'est pas assez. Il y a un fichier supplémentaire qui DOIT être inclus dans l'archive pour que le ZipPackage de travail. Si ce fichier est ajouté, alors la résultante ZIP package peut être ouvert directement à partir de l'Explorateur Windows - pas de problème.
Tout ce que vous avez à faire est d'ajouter le [Content_Types].fichier xml à la racine de l'archive avec un "Défaut" nœud pour chaque extension de fichier que vous souhaitez inclure. Une fois ajouté, j'ai pu parcourir le package à partir de l'Explorateur Windows ou par programmation de décompresser et lire son contenu.
Plus d'informations sur le [Content_Types].fichier xml peut être trouvé ici: http://msdn.microsoft.com/en-us/magazine/cc163372.aspx
Voici un échantillon de la [Content_Types].xml (doit être nommé exactement) file:
<?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>
Et le C# pour la création d'un fichier 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));
}
}
}
Note: