2009-07-04 35 views
8

¿Puedo crear una carpeta comprimida (comprimida) de Windows XP usando Delphi?Crear una carpeta comprimida (comprimida) usando Delphi

+1

Lo "propiedad zip" ¿a qué se refiere? ¿Podrías ser un poco más específico? –

+2

Avance rápido de 2 años a 2011: Delphi XE2 ahora viene con una clase TZipFile integrada en el RTL (ver System.Zip). Tal vez alguien que realmente lo usó podría publicar una respuesta al respecto aquí. –

+1

Se agregó un ejemplo de Delphi XE2. –

Respuesta

5

Según un hilo en eggheadcafe, puede usar CreateFile Function con FILE_FLAG_BACKUP_SEMANTICS para crear una carpeta comprimida.

Para la ruta de extensiones de shell, consulte Using Windows XP "Compressed Folder" shell extension to work with .zip files por Namespace Edanmo, que está escrito en VB.

Acabo de encontrar la pregunta similar en C++. Eche un vistazo al Creating a ZIP file on Windows (XP/2003) in C/C++. Tengo la sensación de que la ruta más fácil es comprar ZipForge. Ver Zip a file in Delphi code sample.

1

Puede usar alguna versión de línea de comando de cualquier compresor como 7zip y realizar la tarea utilizando ShellExecute, o puede usar un componente comercial o gratuito como cualquiera de these.

He usado ZipMaster y se comporta muy bien para mi propósito. No sé cuáles son sus requisitos de tamaño, espacio y rendimiento.

+0

Actualmente estoy usando también, se ajusta exactamente a mis necesidades. –

4

Hace algún tiempo, he intentado todas las bibliotecas de compresión de Delphi que he podido encontrar, y eventualmente terminó usando KaZip por Kiril Antonov.

Mis requisitos eran:

  • Libre;
  • Código abierto;
  • Código nativo de Delphi;
  • Sin dependencias externas (dll, exe). Mi requisito más importante;
  • Huella de memoria pequeña;
  • Fácil de usar;

Lo uso principalmente para convertir archivos .kml en .kmz, y lo hace increíblemente rápido.

Aquí hay un ejemplo de cómo lo uso:

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; 
+0

¿a qué objeto se aplica esa final "Gratis"? Mi suposición es KaZip, pero no tengo el representante para editar. – Argalatyr

+0

Ah, sí KaZip debería liberarse allí ... Se arregló ... Limpié este código en el editor de texto de esta página para que sea un poco más fácil de leer ... Supongo que debería haber comprobado si todavía funciona :) –

2

A "cremallera" carpeta en Windows no es más que un archivo ZIP comprimido con cualquier biblioteca postal estándar. Las carpetas comprimidas son un animal diferente y requieren un formato de disco NTFS.

Para el archivo "Zip", sugiero fuertemente el Turbo Power Abbrevia, que es de código abierto y funciona bien. Es posible que desee comprobar este sitio alternate si usa Delphi 2009, ya que podría ser una copia más reciente.

Si desea utilizar la opción de carpetas comprimidas, deberá modificar los indicadores de directorio en el manejador de directorio.Esto solo afectará a los archivos NUEVOS agregados a ese directorio y no comprimirá automáticamente los archivos existentes. Si tiene un directorio existente que está intentando comprimir, cambie el nombre de cada archivo existente y cárguelo y guárdelo de nuevo en el nombre original, eliminando el archivo original cuando lo complete con cada uno. Yozey tenía un buen enlace a la documentación MSDN. Solo recuerda que esto solo funciona con discos formateados en NTFS, por lo que deberás agregar un cheque para eso en tu código.

3

Echa un vistazo a este OpenSource SynZip unit. Es incluso más rápido para la descompresión que la unidad predeterminada incluida con Delphi, y generará un exe más pequeño (las tablas crc se crean al inicio).

No se necesita dll externo. Funciona desde Delphi 6 hasta XE. No hay problema con la versión Unicode de Delphi. Todo en una sola unidad.

Acabo de realizar algunos cambios para manejar los nombres de archivo Unicode dentro del contenido Zip, no solo el juego de caracteres Win-Ansi, sino también cualquier carácter Unicode. Comentarios son bienvenidos.

+0

¿Puedes dar un ejemplo para usar 'SynZip'? desde [ejemplo] (http://synopse.info/forum/viewtopic.php?pid=163) cómo comprimir una carpeta? – PresleyDias

11

Si está utilizando Delphi X2, sólo tiene que utilizar TZipFile de System.Zip:

Para comprimir una carpeta, utilice:

TZipFile.ZipDirectoryContents('ZipFile.zip', 'C:\Zip\this\right\now'); 

Para comprimir archivos, utilice:

Zip := TZipFile.Create; 
try 
    Zip.Open('ZipFile.zip', zmWrite); 

    Zip.Add('FileToBeZipped.txt'); 
    Zip.Add('ThisWillBeCompressedAgainForSureAndBecomeSmaller.zip'); 
finally 
    Zip.Free; 
end 
+0

usando esto para comprimir una carpeta pero sigue apareciendo "El proceso no puede acceder al archivo porque está siendo utilizado por otro proceso. No estoy seguro de cómo se accede? Libero la lista que tenía con todos los iamges en la carpeta. Libere el archivo ini También estaba escribiendo. ¿Alguna forma de ver qué es acceder a ella? ¿O de cerrar de alguna manera lo que alguna vez accedió a ella? Gracias –

+0

@GlenMorse Después de 3 años leí esta respuesta. Probablemente la primera función no funcione. el zip pero solo con el primer archivo, tal vez esa función se está bloqueando. Use el segundo enfoque, funciona bien –

+0

funciona la primera versión. Solo tiene que salir de su camino. intente algo como TZipFile.ZipDirectoryContents ('.. \ ZipFile.zip', 'C: \ Zip \ this \ right \ now'); –

Cuestiones relacionadas