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