views:

1193

answers:

7

Can I create Windows XP's Compressed (Zipped) Folder using Delphi?

+4  A: 

According to a thread in eggheadcafe, you can use CreateFile Function with FILE_FLAG_BACKUP_SEMANTICS to create a Compressed Folder.

For shell extensions route, take a look at Using Windows XP "Compressed Folder" shell extension to work with .zip files by Namespace Edanmo, which is written in VB.

I just found the similar question asked on C++. Take a look at Creating a ZIP file on Windows (XP/2003) in C/C++. I have a feeling the easiest route is buying ZipForge. See Zip a file in Delphi code sample.

eed3si9n
A: 

You can use some command line version of any compressor like 7zip and do the task using ShellExecute, or you can use a free or comercial component like anyone of these.

I had used ZipMaster and it behaves very well for my purpose. I don't know what are your size, space and performance requirements.

eKek0
I'm currently using it too, fits exactaly my needs.
Gedean Dias
+1  A: 

You could use TurboPower Abbrevia which is now open source.

Steve
+1  A: 

Take a look at these:

yozey
+1  A: 

Similar SO questions with relevant answers:

How-do-i-compress-multiple-files-into-a-single-archive-with-delphi

Using-7zip-from-delphi

Argalatyr
+1  A: 

Some time ago, I've tried all of the Delphi compression libraries that I could find, and eventually I ended up using KaZip by Kiril Antonov.

My requirements were:

  • Free;
  • Open source;
  • Native Delphi code;
  • No external dependencies (dll, exe). My most important requirement;
  • Small memory footprint;
  • Easy to use;

I use it mainly to turn .kml files into .kmz, and it does that amazingly fast.

Here's an example of how I use it:

uses
  KaZip;

...

// replaces a .kml file with a .kmz file
procedure KmlToKmz(const aFileName: string);
var
  FS: TFileStream;
  KaZip:TKaZip;
  KmzFileName:TFileName;
begin
  KmzFileName := ChangeFileExt(aFileName, '.kmz');
  KaZip := TKaZip.Create(nil);
  try
    // create an empty zipfile with .kmz extension:
    FS := TFileStream.Create(KmzFileName, fmOpenReadWrite or FmCreate);
    try
      KaZip.CreateZip(FS);
    finally
      FS.Free;
    end;        

    KaZip.Open(KmzFileName); // Open the new .kmz zipfile
    KaZip.Entries.AddFile(aFileName); // add the .kml
    KaZip.Close; 
    DeleteFile(aFileName); // delete the .kml
  finally
    KaZip.Free;
  end;
end;
Wouter van Nifterick
to what object does that final "Free" apply? My guess is KaZip, but I don't have the rep to edit.
Argalatyr
Ah, yes KaZip should be freed there.. Fixed it.. I cleaned this code up in the text editor of this page to make it a bit easier to read.. I guess I should've checked if it still works :)
Wouter van Nifterick
A: 

A "zipped" folder in Windows is nothing more than a .ZIP file compressed using any standard zip library. Compressed folders are a different animal and require an NTFS disk format.

For the "Zip" file, I strongly suggest the Turbo Power Abbrevia, which is open source and works well. You might want to check this alternate site if your using Delphi 2009 as it might be a more recent copy.

If your wanting to use the compressed folders option, you will need to modify the directory flags on the directory handle. This will only impact NEW files added to that directory and will not automatically compress existing files. If you have an existing directory you are trying to compress, then rename each existing file, and load and save it back to the original name deleting the original file when complete with each one. Yozey had a good link to the MSDN documentation. Just remember that this only works with NTFS formatted disks, so you will need to add a check for that in your code.

skamradt