DotNetZip - это zip-архивная библиотека для .NET.
Использование DotNetZip позволяет случайным образом ссылаться на отдельные записи в zip и может распаковывать их вне порядка и может возвращать поток, который распаковывается при извлечении записи.
С помощью этих функций DotNetZip был использован в реализации Virtual Path Provider for ASP.NET, что делает именно то, что вы описали, - он обслуживает весь контент для определенного сайта из сжатого ZIP-файла. Вы также можете создавать веб-страницы с динамическими страницами (ASP.NET).
ASP.NET ZIP Virtual Path Provider, based on DotNetZip
Важный код выглядит следующим образом:
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;
}
}
}
И VirtualFile определяется следующим образом:
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();
}
}
}
Если вы хотите получить произвольный доступ, вам, вероятно, придется так или иначе удалять входные данные. Что может быть лучше, чем побочная статья? –
... которые почти все библиотеки компрессии поддерживают, статья приравнивается к записи файла. –
Также ... Я сомневаюсь, что будет значительная разница между степенью сжатия для статей по отдельности и степенью сжатия для всего, поскольку они должны иметь в основном одинаковое соотношение буквенных вхождений. Вы сравнили это требование? –