⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.htm

📁 delphi 实现 7Z 格式压缩、解压缩的的源代码
💻 HTM
📖 第 1 页 / 共 2 页
字号:
Delphi API</h1></blockquote>
<p>This API use the 7-zip plugins to read and write all 7-zip
supported archive formats. You need all files located in the "Formats"
and "Codecs" folders from 7-zip install directory.</p><p>- Autor: Henri Gourvest &lt;hgourvest@progdigy.com&gt;<br />- Licence: MPL1.1<br />- Date: 8/8/2006<br />- Version: 1.0</p>
<h2>Reading archive:</h2>
<h3>Extract to path:</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-space"> </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\zip.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword">begin<br /></span><span class="pas1-space">   OpenFile(</span><span class="pas1-string">'c:\test.zip'</span><span class="pas1-symbol">);<br />   ExtractTo(</span><span class="pas1-string">'c:\test'</span><span class="pas1-symbol">);<br /> </span><span class="pas1-reservedword">end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h3>Get
file list:</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-space"> </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\7z.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword">begin<br /></span><span class="pas1-space">   OpenFile(</span><span class="pas1-string">'c:\test.7z'</span><span class="pas1-symbol">);<br /></span><span class="pas1-reservedword">   for</span><span class="pas1-space"> i := </span><span class="pas1-number">0</span><span class="pas1-space"> </span><span class="pas1-reservedword">to</span><span class="pas1-space"> NumberOfItems - </span><span class="pas1-number">1</span><span class="pas1-space"> </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space">   </span><span class="pas1-reservedword"> if</span><span class="pas1-space"> </span><span class="pas1-reservedword">not</span><span class="pas1-space"> ItemIsFolder[i] </span><span class="pas1-reservedword">then<br /></span><span class="pas1-space">      Writeln(ItemPath[i]);<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h3>Extract
to stream</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-space"> </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\7z.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword">begin<br /></span><span class="pas1-space">   OpenFile(</span><span class="pas1-string">'c:\test.7z'</span><span class="pas1-symbol">);<br /></span><span class="pas1-reservedword">   for</span><span class="pas1-space"> i := </span><span class="pas1-number">0</span><span class="pas1-space"> </span><span class="pas1-reservedword">to</span><span class="pas1-space"> NumberOfItems - </span><span class="pas1-number">1</span><span class="pas1-space"> </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword">    if</span><span class="pas1-space"> </span><span class="pas1-reservedword">not</span><span class="pas1-space"> ItemIsFolder[i] </span><span class="pas1-reservedword">then<br /></span><span class="pas1-space">       ExtractItem(i, stream, false);<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h3>Extract
"n" Items</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-reservedword">function</span><span class="pas1-space"> GetStreamCallBack(sender: Pointer; index: Cardinal;<br /></span><span class="pas1-reservedword">  var</span><span class="pas1-space"> outStream: ISequentialOutStream): HRESULT; </span><span class="pas1-reservedword">stdcall</span><span class="pas1-symbol">;<br /></span><span class="pas1-reservedword">begin<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword"> case</span><span class="pas1-space"> index </span><span class="pas1-reservedword">of</span><span class="pas1-space"> ...<br />    outStream := T7zStream.Create(aStream, soReference);<br />  Result := S_OK;<br /></span><span class="pas1-reservedword">end</span><span class="pas1-symbol">;<br /><br /></span><span class="pas1-reservedword">procedure</span><span class="pas1-space"> TMainForm.ExtractClick(Sender: TObject);<br /></span><span class="pas1-reservedword">var<br /></span><span class="pas1-space">  i: integer;<br />  items: </span><span class="pas1-reservedword">array</span><span class="pas1-symbol">[</span><span class="pas1-number">0</span><span class="pas1-symbol">..</span><span class="pas1-number">2</span><span class="pas1-symbol">] </span><span class="pas1-reservedword">of</span><span class="pas1-space"> Cardinal;<br /></span><span class="pas1-reservedword">begin<br /></span><span class="pas1-space">  </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\7z.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space">    OpenFile(</span><span class="pas1-string">'c:\test.7z'</span><span class="pas1-symbol">);<br /></span></span></code><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-comment">    // items must be sorted by index!<br />   </span></span></code><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-symbol">&nbsp;items[</span><span class="pas1-number">0</span><span class="pas1-symbol">] := </span><span class="pas1-number">0</span><span class="pas1-symbol">;<br />    items[</span><span class="pas1-number">1</span><span class="pas1-symbol">] := </span><span class="pas1-number">1</span><span class="pas1-symbol">;<br />    items[</span><span class="pas1-number">2</span><span class="pas1-symbol">] := </span><span class="pas1-number">2</span><span class="pas1-symbol">;<br />    ExtractItems(@items, Length(items), false, </span><span class="pas1-reservedword">nil</span><span class="pas1-symbol">, GetStreamCallBack);<br /></span><span class="pas1-reservedword">  end</span><span class="pas1-symbol">;<br /></span><span class="pas1-reservedword">end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h3>Open
stream</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-space"> </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\zip.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"></span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space">   OpenStream(T7zStream.Create(TFileStream.Create(</span><span class="pas1-string">'c:\test.zip'</span><span class="pas1-symbol">, fmOpenRead), soOwned));<br />   OpenStream(aStream, soReference);<br />   ...<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h3>Progress
bar</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-reservedword"> function</span><span class="pas1-space"> ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; </span><span class="pas1-reservedword">stdcall</span><span class="pas1-symbol">;<br /></span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space">   </span><span class="pas1-reservedword">if</span><span class="pas1-space"> total </span><span class="pas1-reservedword">then<br /></span><span class="pas1-space">     Mainform.ProgressBar.Max := value </span><span class="pas1-reservedword">else<br /></span><span class="pas1-space">     Mainform.ProgressBar.Position := value;<br />   Result := S_OK;<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /><br /></span><span class="pas1-reservedword"> procedure</span><span class="pas1-space"> TMainForm.ExtractClick(Sender: TObject);<br /></span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space">   </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\zip.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space"> </span><span class="pas1-reservedword">  begin<br /></span><span class="pas1-space">     OpenFile(</span><span class="pas1-string">'c:\test.zip'</span><span class="pas1-symbol">);<br />     SetProgressCallback(</span><span class="pas1-reservedword">nil</span><span class="pas1-symbol">, ProgressCallback);<br />     ...<br /></span><span class="pas1-reservedword">   end</span><span class="pas1-symbol">;<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h3>Password</h3>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-reservedword"> function</span><span class="pas1-space"> PasswordCallback(sender: Pointer; </span><span class="pas1-reservedword">var</span><span class="pas1-space"> password: WideString): HRESULT; </span><span class="pas1-reservedword">stdcall</span><span class="pas1-symbol">;<br /></span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space"></span></span></code><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-comment">   // call a dialog box ...<br /></span></span></code><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-space">&nbsp;  password := </span><span class="pas1-string">'password'</span><span class="pas1-symbol">;<br />   Result := S_OK;<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /><br /></span><span class="pas1-reservedword"> procedure</span><span class="pas1-space"> TMainForm.ExtractClick(Sender: TObject);<br /></span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space">   </span><span class="pas1-reservedword">with</span><span class="pas1-space"> CreateInArchive(</span><span class="pas1-string">'Formats\zip.dll'</span><span class="pas1-symbol">) </span><span class="pas1-reservedword">do<br /></span><span class="pas1-space">   </span><span class="pas1-reservedword">begin<br /></span><span class="pas1-space">   </span><span class="pas1-comment">  // using callback<br /></span><span class="pas1-space">     SetPasswordCallback(</span><span class="pas1-reservedword">nil</span><span class="pas1-symbol">, PasswordCallback);<br /></span><span class="pas1-comment">     // or setting password directly<br /></span><span class="pas1-space">     SetPassword(</span><span class="pas1-string">'password'</span><span class="pas1-symbol">);<br />     OpenFile(</span><span class="pas1-string">'c:\test.zip'</span><span class="pas1-symbol">);<br />     ...<br /></span><span class="pas1-reservedword">   end</span><span class="pas1-symbol">;<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /></span></span><br /></code></pre><h2>Writing
archive</h2>
<pre><code><span style="font-family: Courier New; font-style: normal; font-variant: normal; font-weight: normal; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><span class="pas1-reservedword"> procedure</span><span class="pas1-space"> TMainForm.ExtractAllClick(Sender: TObject);<br /></span><span class="pas1-reservedword"> var<br /></span><span class="pas1-space">   Arch: I7zOutArchive;<br /></span><span class="pas1-reservedword"> begin<br /></span><span class="pas1-space">   Arch := CreateOutArchive(</span><span class="pas1-string">'Formats\7z.dll'</span><span class="pas1-symbol">);<br /></span><span class="pas1-comment">   // add a file<br /></span><span class="pas1-space">   Arch.AddFile(</span><span class="pas1-string">'c:\test.bin'</span><span class="pas1-symbol">, </span><span class="pas1-string">'folder\test.bin'</span><span class="pas1-symbol">);<br /></span><span class="pas1-comment">   // add files using willcards and recursive search<br /></span><span class="pas1-space">   Arch.AddFiles(</span><span class="pas1-string">'c:\test'</span><span class="pas1-symbol">, </span><span class="pas1-string">'folder'</span><span class="pas1-symbol">, </span><span class="pas1-string">'*.pas;*.dfm'</span><span class="pas1-symbol">, true);<br /></span><span class="pas1-comment">   // add a stream<br /></span><span class="pas1-space">   Arch.AddStream(aStream, soReference, faArchive, CurrentFileTime, CurrentFileTime, </span><span class="pas1-string">'folder\test.bin'</span><span class="pas1-symbol">, false, false);<br /></span><span class="pas1-comment">   // compression level<br /></span><span class="pas1-space">   SetCompressionLevel(Arch, </span><span class="pas1-number">5</span><span class="pas1-symbol">);<br /></span><span class="pas1-comment">   // compression method if &lt;&gt; LZMA<br /></span><span class="pas1-space">   SevenZipSetCompressionMethod(Arch, m7BZip2);<br /></span><span class="pas1-comment">   // add a progress bar ...<br /></span><span class="pas1-space">   Arch.SetProgressCallback(...);<br /></span><span class="pas1-comment">   // set a password if necessary<br /></span><span class="pas1-space">   Arch.SetPassword(</span><span class="pas1-string">'password'</span><span class="pas1-symbol">);<br /></span><span class="pas1-comment">   // Save to file<br /></span><span class="pas1-space">   Arch.SaveToFile(</span><span class="pas1-string">'c:\test.zip'</span><span class="pas1-symbol">);<br /></span><span class="pas1-comment">   // or a stream<br /></span><span class="pas1-space">   Arch.SaveToStream(aStream);<br /></span><span class="pas1-reservedword"> end</span><span class="pas1-symbol">;<br /></span></span>
</code></pre>
</body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -