【Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(一)

本文介绍了如何在Delphi应用程序中直接在内存中加载和解压RAR、ZIP、TAR和GZIP压缩文件,避免生成临时文件。通过使用7-Zip库(sevenzip.pas),提供了LoadFromFile、LoadFromStream等功能,并给出了示例程序代码。
摘要由CSDN通过智能技术生成

==============================

关键词:压缩文件、压缩包、7zip、SevenZip、RAR、内存读取、内存解压、TAR、GZIP、ZIP

==============================

基于安全软件考虑,有时候为了不在本地生成临时文件,应用程序需要直接在内存打开加载各种类型的文件。

目前比较困难的文件类型是EXE、PDF、压缩文件、音频视频文件等。

其中EXE网络上有部分PELoader的实现源码,当对系统兼容性并不是很好,希望有这方面开发的朋友可以提供相关源码,多谢。

本文涉及内容相对较为简单,但却比较实用。

文件压缩/解压实现原理相对比较复杂,本文也不会讨论压缩算法方面的知识(实在是力不能及)。

对于一般应用程序,要实现从内存直接加载/读取/解析/解压压缩包,使用现有的压缩类库是最好的方案。

在比较各种压缩包开发库后,选择出使用7zip(sevenZip)的库读取各种类型的压缩包,网络上已有封装好7z.dll中各个API的delphi版sevenzip.pas。

本文也可以作为基于7ZIP自主开发解压软件的示例。

 

使用注意:

1)7z.dll:直接安装7-zip后在安装目录下就有。

2)sevenzip.pas:在本文最后附上

 

以下是对sevenzip.pas二次封装,实现下面功能:

1)实现LoadFromFile、LoadFromStream函数,对于熟悉VCL的这2个方法会比较亲切

2)实现按多层目录(目录树)获取文件列表的函数GetItems(只是简单实现,方便命令行程序开发)

3)实现解压指定文件函数:ExtractItemToStream、ExtractItemToFile

 

示例程序:

【Delphi】从内存直接读取加载或解压压缩文件(RAR、ZIP、TAR、GZIP)等(二)

 

sevenzip.pas源码:

【Delphi】从内存直接读取加载或解压压缩文件(RAR、ZIP、TAR、GZIP)等(三)

 

源码:

unit D7zUtils;
  
interface
uses
  SysUtils, Classes, Sevenzip;
  
type
  TD7zFileType = (dftZip, dftBZ2, dftRar, dftArj, dftZ, dftLzh, dft7z, dftCab, dftNsis, dftLzma,
    dftPe, dftElf, dftMacho, dftUdf, dftXar, dftMub, dftHfs, dftDmg, dftCompound,
    dftWim, dftIso, dftBkf, dftChm, dftSplit, dftRpm, dftDeb, dftCpio, dftTar,
    dftGZip);
  TD7zFileTypes = set of TD7zFileType;
  
  TD7zipStrings = TStrings;
  TD7zipStringList = class(TStringList)
  public
    constructor Create();virtual;
  end;
  
  TOnPassword = procedure (Sender: TObject; var sPassword: WideString; var bContinue:Boolean) of object;
  TOnProgress = procedure (Sender: TObject; bIsTotal: boolean; iValue: Int64; var bContinue:Boolean) of object;
  
  TD7zipFile = class
  private
    FInArchive: I7zInArchive;
    FItems: TD7zipStrings;
    FTmpStream: TStream;
  private
    FCurrentItemPath: WideString;
    FOnPassword: TOnPassword;
    FOnProgress: TOnProgress;
  private
    FPasswordCallback: T7zPasswordCallback;
    FProgressCallback: T7zProgressCallback;
    function DoOnPassword(var sPassword: WideString): HRESULT;
    function DoOnProgress(bIsTotal: boolean; iValue: Int64): HRESULT;
  public
    constructor Create();virtual;
    destructor Destroy;override;
    function LoadFromFile(AFileName: WideString):Boolean;
    function LoadFromStream(AStream: TStream; AFileTypes: TD7zFileTypes=[]):Boolean;overload;
    function LoadFromStream(AStream: TStream; AFileType: TD7zFileType):Boolean;overload;
  public
    function GetItems(sPath: WideString; iFilter: Integer=0): TD7zipStrings;//iFilter: 0-All 1-File 2 Dir ;  sPath-暂不支持通配符
  public
    function ExtractItemToStream(sFileName: WideString; AStream: TStream):Boolean; //解压/获取单个文件
    function ExtractItemToFile(sFileName: WideString; sToFile: WideString):Boolean;//解压/获取单个文件
  public
    property CurrentItemPath: WideString read FCurrentItemPath;
  public
    //fileSystem functions
    function FileExists(sFileName: WideString):Boolean;
    function DirectoryExists(sDirName: WideString):Boolean;
    function GetCurrentDir(): WideString;
  public
    property OnPassword: TOnPassword read FOnPassword write FOnPassword;
    property OnProgress: TOnProgress read FOnProgress write FOnProgress;
  end;
  
im
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值