DotNetZip ist eine Zip-Archiv-Bibliothek für .NET.
Mit DotNetZip können Sie auf bestimmte Einträge in der ZIP-Datei nach dem Zufallsprinzip verweisen, sie in anderer Reihenfolge dekomprimieren und einen Stream zurückgeben, der beim Extrahieren eines Eintrags dekomprimiert wird.
Mit dem Nutzen dieser Funktionen wurde DotNetZip bei der Implementierung eines Virtueller Pfadanbieter für ASP.NET die genau das tut, was Sie beschreiben - sie liefert den gesamten Inhalt einer bestimmten Website aus einer komprimierten ZIP-Datei. Sie können auch Websites mit dynamischen Seiten (ASP.NET-Seiten) erstellen.
ASP.NET ZIP Virtual Path Provider, basierend auf DotNetZip
Der wichtige Code sieht wie folgt aus:
namespace Ionic.Zip.Web.VirtualPathProvider
{
public class ZipFileVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
{
ZipFile _zipFile;
public ZipFileVirtualPathProvider (string zipFilename) : base () {
_zipFile = ZipFile.Read(zipFilename);
}
~ZipFileVirtualPathProvider () { _zipFile.Dispose (); }
public override bool FileExists (string virtualPath)
{
string zipPath = Util.ConvertVirtualPathToZipPath (virtualPath, true);
ZipEntry zipEntry = _zipFile[zipPath];
if (zipEntry == null)
return false;
return !zipEntry.IsDirectory;
}
public override bool DirectoryExists (string virtualDir)
{
string zipPath = Util.ConvertVirtualPathToZipPath (virtualDir, false);
ZipEntry zipEntry = _zipFile[zipPath];
if (zipEntry != null)
return false;
return zipEntry.IsDirectory;
}
public override VirtualFile GetFile (string virtualPath)
{
return new ZipVirtualFile (virtualPath, _zipFile);
}
public override VirtualDirectory GetDirectory (string virtualDir)
{
return new ZipVirtualDirectory (virtualDir, _zipFile);
}
public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
{
return null;
}
public override System.Web.Caching.CacheDependency GetCacheDependency(String virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
{
return null;
}
}
}
Und VirtualFile ist wie folgt definiert:
namespace Ionic.Zip.Web.VirtualPathProvider
{
class ZipVirtualFile : VirtualFile
{
ZipFile _zipFile;
public ZipVirtualFile (String virtualPath, ZipFile zipFile) : base(virtualPath) {
_zipFile = zipFile;
}
public override System.IO.Stream Open ()
{
ZipEntry entry = _zipFile[Util.ConvertVirtualPathToZipPath(base.VirtualPath,true)];
return entry.OpenReader();
}
}
}