delphi 2009を使用してVistaにディレクトリ/ファイルのzipファイルを作成する機能

StackOverflow https://stackoverflow.com/questions/1634258

質問

デルファイを使用して圧縮および圧縮する簡単な方法を探しています。私はすでにtorry delphiのコンポーネントを見ました: http://www.torry.net /pages.php?s=99 。それらはすべて私が望むものを達成するように見えますが、それらを使用するいくつかの欠点は、デルファイ2009で実行されず、デルファイ2009に移植するのが難しい非常に複雑なことです。少なくとも私にとっては、それらは希少です。 DLLの束を使用するオーバーヘッドのない基本的な圧縮機能が必要です。私の探求はFSCTL_SET_COMPRESSIONに私を導き、それは私が問題を解決するだろうと思ったが、残念ながらこれもうまくいきませんでした。 CREATEFILEは、FSCTL_SETと同じ結果が得られるまで、有望に見えました... Windowsには、ネイティブの圧縮機能が制限されていることがわかっています。たとえば、ファイルまたはフォルダを右クリックして「->」を選択すると、 sendTo-> zipフォルダー、zipアーカイブがスマートに作成されます。デルファイからその機能にアクセスできれば、それが解決策になると思います。副次的な問題として、Linuxにはこれと同様に使用できるネイティブの圧縮機能がありますか?

役に立ちましたか?

解決

TurboPowerの優れたAbbreviaはD2009 こちらでダウンロードできます。D2010のサポートは現在進行中であり、すでに利用可能ですsvn フォーラムに従って

Abbreviaは、以前は商用($$$$)製品でした。つまり、ドキュメントは完全です。

他のヒント

Zipforgeを使用しています。これらをD2009に移植するのに問題があるのはなぜですか? 64ビットのせいですか?

サンプルコード

procedure ZipIt;
var
  Archiver: TZipForge;
  FileName: String;
begin
    try
      Archiver:= TZipForge.create(self);
      with Archiver do begin
        FileName := 'c:\temp\myzip.zip';

        // Create a new archive file
        OpenArchive(fmCreate);

        // Set path to folder with some text files to BaseDir
        BaseDir := 'c:\temp\';

        // Add all files and directories from 'C:\SOURCE_FOLDER' to the archive
        AddFiles('myfiletozip.txt');


        // Close the archive
        CloseArchive;
      end;
    finally
      Archiver.Free;
    end;
end;

「できる」場合DelphiのCOMを使用すると、Windowsシェルの組み込みzip機能を利用できます。基本的な優れた機能を提供します。

VBScriptでは、次のようになります。

Sub CreateZip(pathToZipFile, dirToZip)

    WScript.Echo "Creating zip  (" & pathToZipFile & ") from folder (" & dirToZip & ")"

    Dim fso
    Set fso= Wscript.CreateObject("Scripting.FileSystemObject")

    If fso.FileExists(pathToZipFile) Then
        WScript.Echo "That zip file already exists - deleting it."
        fso.DeleteFile pathToZipFile
    End If

    If Not fso.FolderExists(dirToZip) Then
        WScript.Echo "The directory to zip does not exist."
        Exit Sub
    End If

    NewZip pathToZipFile

    dim sa
    set sa = CreateObject("Shell.Application")

    Dim zip
    Set zip = sa.NameSpace(pathToZipFile)

    WScript.Echo "opening dir  (" & dirToZip & ")"

    Dim d
    Set d = sa.NameSpace(dirToZip)


    For Each s In d.items
        WScript.Echo  s
    Next

    ' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
    ' ===============================================================
    ' 4 = do not display a progress box
    ' 16 = Respond with "Yes to All" for any dialog box that is displayed.
    ' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified. 
    ' 256 = Display a progress dialog box but do not show the file names.
    ' 2048 = Version 4.71. Do not copy the security attributes of the file.
    ' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.

    WScript.Echo "copying files..."

    zip.CopyHere d.items, 4

    ' wait until finished
    sLoop = 0
    Do Until d.Items.Count <= zip.Items.Count
        Wscript.Sleep(1000)
    Loop

End Sub

COMでは、 DotNetZip を使用することも許可されています。これは無料でダウンロードでき、パスワードで暗号化されたzipを実行し、 zip64、自己解凍アーカイブ、ユニコード、スパンzipなど。

個人的には、D2009とD2010で問題なく動作するVCL Zipを使用しています。この投稿の時点で120ドルかかりますが、非常にシンプルで柔軟性があり、何よりも高速です。

VCLZIP をご覧になり、興味がある場合はトレイルをダウンロードしてください

賢明なコード:

VCLZip1.ZipName := ‘myfiles.zip’;
VCLZip1.FilesList.add(‘c:\mydirectory\*.*’);
VCLZip1.Zip;

基本的なzipに必要なものはすべて、もちろん圧縮レベル、ディレクトリ構造、zipストリーム、unzipストリームなどを設定できます。

これが何らかの助けになることを願っています。

RE

このオープンソースSynZipユニットをご覧ください。 Delphiに同梱されているデフォルトのユニットよりも解凍がさらに高速で、小さなexeが生成されます(crcテーブルは起動時に作成されます)。

外部dllは必要ありません。 Delphi 6からXEまで動作します。 UnicodeバージョンのDelphiでは問題ありません。すべてを1つのユニットに。

Win-Ansi文字セットだけでなく、Unicode文字も含め、Zipコンテンツ内のUnicodeファイル名を処理するためにいくつかの変更を加えました。フィードバックは大歓迎です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top