DotNetZip est une bibliothèque d'archives zip pour .NET. En utilisant DotNetZip, vous pouvez référencer des entrées particulières dans le zip de manière aléatoire, et les décomprimer dans le désordre, et retourner un flux qui décompresse lorsqu'il extrait une entrée. Avec l'avantage de ces fonctionnalités, DotNetZip a été utilisé dans l'implémentation d'un Virtual Path Provider for ASP.NET, qui fait exactement ce que vous décrivez - il sert tout le contenu pour un site web particulier à partir d'un fichier ZIP compressé. Vous pouvez également faire des sites Web avec des pages dynamiques (ASP.NET).
ASP.NET ZIP Virtual Path Provider, based on DotNetZip
Le code importante ressemble à ceci:
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;
}
}
}
Et VirtualFile est défini comme ceci:
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();
}
}
}
Si vous voulez un accès aléatoire, vous devrez probablement découper l'entrée d'une façon ou d'une autre. Quelle meilleure façon de découper est là que par article? –
... que pratiquement toutes les bibliothèques de compression supportent, l'article correspondant à une entrée de fichier. –
Aussi ... Je doute qu'il y aura une grande différence entre le taux de compression pour les articles individuellement et le taux de compression pour l'ensemble, car ils devraient avoir essentiellement le même ratio d'occurrences de lettre. Avez-vous évalué cette réclamation? –