AsphyreArc7z.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:6k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreArc7z;
  2. //---------------------------------------------------------------------------
  3. // AsphyreArc7z.pas                                     Modified: 07-Jan-2007
  4. // Archive Wrapper for 7z file format                             Version 1.0
  5. //---------------------------------------------------------------------------
  6. // The contents of this file are subject to the Mozilla Public License
  7. // Version 1.1 (the "License"); you may not use this file except in
  8. // compliance with the License. You may obtain a copy of the License at
  9. // http://www.mozilla.org/MPL/
  10. //
  11. // Software distributed under the License is distributed on an "AS IS"
  12. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  13. // License for the specific language governing rights and limitations
  14. // under the License.
  15. //---------------------------------------------------------------------------
  16. interface
  17. //---------------------------------------------------------------------------
  18. uses
  19.  Windows, Classes, SysUtils, AsphyreAsserts, MediaUtils, AsphyreArchives,
  20.  SevenZipVCL;
  21. //---------------------------------------------------------------------------
  22. type
  23.  TAsphyreArchive7z = class(TAsphyreCustomArchive)
  24.  private
  25.   FArchive: TSevenZip;
  26.   FileList: array of string;
  27.   procedure ClearList();
  28.   function AddToList(const FileName: string): Integer;
  29.   procedure EventListFile(Sender: TObject; Filename: WideString; FileIndex,
  30.    FileSizeU, FileSizeP, Fileattr, Filecrc: Cardinal; FileMethod: WideString;
  31.    FileTime: Double);
  32.  protected
  33.   function GetItemCount(): Integer; override;
  34.   function GetItemName(Num: Integer): string; override;
  35.   function OpenArchive(const FileName: string): Boolean; override;
  36.   procedure CloseArchive(); override;
  37.   procedure DoCreate(); override;
  38.  public
  39.   property Archive: TSevenZip read FArchive;
  40.   function ExtractToDisk(const ItemName,
  41.    DestPath: string): Boolean; override;
  42.   function ExtractToStream(const ItemName: string;
  43.    Stream: TStream): Boolean; override;
  44.  end;
  45. //---------------------------------------------------------------------------
  46. procedure Register7z(const Ext: string);
  47. //---------------------------------------------------------------------------
  48. implementation
  49. //---------------------------------------------------------------------------
  50. procedure TAsphyreArchive7z.DoCreate();
  51. begin
  52.  FAttributes:= [aaNoExtractToMem];
  53. end;
  54. //---------------------------------------------------------------------------
  55. procedure TAsphyreArchive7z.ClearList();
  56. begin
  57.  SetLength(FileList, 0);
  58. end;
  59. //---------------------------------------------------------------------------
  60. function TAsphyreArchive7z.AddToList(const FileName: string): Integer;
  61. var
  62.  Index: Integer;
  63. begin
  64.  Index:= Length(FileList);
  65.  SetLength(FileList, Index + 1);
  66.  FileList[Index]:= FileName;
  67.  Result:= Index;
  68. end;
  69. //---------------------------------------------------------------------------
  70. procedure TAsphyreArchive7z.EventListFile(Sender: TObject; FileName: WideString;
  71.  FileIndex, FileSizeU, FileSizeP, Fileattr, Filecrc: Cardinal;
  72.  FileMethod: WideString; FileTime: Double);
  73. begin
  74.  AddToList(FileName);
  75. end;
  76. //---------------------------------------------------------------------------
  77. function TAsphyreArchive7z.OpenArchive(const FileName: string): Boolean;
  78. begin
  79.  Result:= True;
  80.  if (FArchive = nil) then
  81.   begin
  82.    FArchive:= TSevenZip.Create(nil);
  83.    FArchive.OnListfile:= EventListFile;
  84.   end;
  85.  if (FArchive.SZFileName <> FileName) then
  86.   begin
  87.    ClearList();
  88.    FArchive.SZFileName:= FileName;
  89.    Result:= True;
  90.    try
  91.     FArchive.List();
  92.    except
  93.     Result:= False;
  94.    end;
  95.   end;
  96. end;
  97. //---------------------------------------------------------------------------
  98. procedure TAsphyreArchive7z.CloseArchive();
  99. begin
  100.  if (FArchive <> nil) then
  101.   begin
  102.    FArchive.Free();
  103.    FArchive:= nil;
  104.   end;
  105. end;
  106. //---------------------------------------------------------------------------
  107. function TAsphyreArchive7z.GetItemCount(): Integer;
  108. begin
  109.  Result:= Length(FileList);
  110. end;
  111. //---------------------------------------------------------------------------
  112. function TAsphyreArchive7z.GetItemName(Num: Integer): string;
  113. begin
  114.  Assert((Num >= 0)and(Num < Length(FileList)), msgIndexOutOfBounds);
  115.  Result:= FileList[Num];
  116. end;
  117. //---------------------------------------------------------------------------
  118. function TAsphyreArchive7z.ExtractToDisk(const ItemName,
  119.  DestPath: string): Boolean;
  120. begin
  121.  FArchive.ExtrBaseDir:= DestPath;
  122.  FArchive.ExtractOptions:= FArchive.ExtractOptions + [ExtractOverwrite];
  123.  FArchive.Files.Clear();
  124.  FArchive.Files.AddString(IntToStr(FArchive.GetIndexByFilename(ItemName)));
  125.  Result:= (FArchive.Extract() <> 1);
  126. end;
  127. //---------------------------------------------------------------------------
  128. function TAsphyreArchive7z.ExtractToStream(const ItemName: string;
  129.  Stream: TStream): Boolean;
  130. var
  131.  TempPath, TempFile: string;
  132.  Aux: TFileStream;
  133. begin
  134.  TempPath:= GetTempPath();
  135.  Result:= ExtractToDisk(ItemName, TempPath);
  136.  if (Result) then
  137.   begin
  138.    TempFile:= MakeValidPath(TempPath) + MakeValidFileName(ItemName);
  139.    try
  140.     Aux:= TFileStream.Create(TempFile, fmOpenRead or fmShareDenyWrite);
  141.    except
  142.     Result:= False;
  143.     DeleteFile(TempFile);
  144.     Exit;
  145.    end;
  146.    try
  147.     try
  148.      Stream.CopyFrom(Aux, Aux.Size);
  149.     except
  150.      Result:= False;
  151.     end;
  152.    finally
  153.     Aux.Free();
  154.     DeleteFile(TempFile);
  155.    end;
  156.   end;
  157. end;
  158. //---------------------------------------------------------------------------
  159. procedure Register7z(const Ext: string);
  160. begin
  161.  ArchiveManager.RegisterExt(Ext, TAsphyreArchive7z);
  162. end;
  163. //---------------------------------------------------------------------------
  164. end.