Zipper une liste de fichiers

Il y a pléthore de fils de discussion sur ce sujet ; la sortie en V18 de la commande ZIP Create archive devrait rendre obsolètes les autres solutions.
Mais à part lahttps://github.com/miyako/4d-plugin-zip solution de Miyako> (multiple input for Zip (C_TEXT or stringified C_COLLECTION)), je n’arrive pas à voir s’il y a la possibilité de mettre une liste de fichiers à zipper.
Il y a aussi la solution de Bruno mais le paramètre $3 est ambigu : $3 => fileList (TEXT) : path to a file containing file path (dos/posix with space escaped) (optional, default “”) => fichier ou liste de fichiers ?
Pour la commande ZIP Create archive, on passe un objet File ou Folder, ce qui exclue me semble-t-il la liste sur mesure.
J’ai utilisé autrefois des applications de zippage qui permettaient l’ajout de fichiers.

Avez-vous une expérience à partager ?

Bernard as-tu seulement lu
https://doc.4d.com/4Dv18/4D/18/ZIP-Creer-archive.301-4672146.fr.htmll
doc >?

Il est indiqué ceci:

: Doc 4D

Vous pouvez passer soit un objet fichierOuDossier ou structureZip
en tant que premier paramètre.

avec les explications plus bas.

J’ai pas testé, mais il semble donc possible de zipper plusieurs fichiers…

Si Manuel, j’ai lu la doc.
La doc précise que l’objet structure contient la source qui est soit un fichier soit un dossier (les deux sont des objets générés par File() ou Folder()).
Or je veux pouvoir sélectionner certains fichiers et pas dans le même dossier, sans les recopier.
Bruno, tu peux préciser comment fonctionne ta méthode ?

On ne doit pas lire la même doc :lol:

Dans le premier parametre si tu choisis d’utiliser la notion de
structureZip

tu peux y passer :

: Doc 4D

structureZip
Avec cette syntaxe, vous passez un objet décrivant l’objet d’archive
ZIP en tant que paramètre (s’il est passé, le paramètre options est
ignoré dans ce cas). Les propriétés suivantes sont disponibles pour
définir la structure:

files (collection)
soit une collection d’objets Fichier ou Dossier, ou
soit une collection d’objets avec les propriétés suivantes : etc…

Donc, oui, tu peux construire ta propre collection de fichier_s_ et zipper les fichiers ne provenant pas tous d’un seul et même dossier :razz:

Bonjour Bernard,

Vous pouvez passez une collection de fichiers et de dossiers à compresser à l’object ‘zipStructure’.

Voici un exemple:

<code 4D>
$zip:=New object
$zip.files:=New collection()
$zip.files.push(New object(“source”;Folder(fk desktop folder).file(“Tests/text.txt”)))
$zip.files.push(New object(“source”;Folder(fk desktop folder).file(“Tests/text2.txt”)))
$zip.files.push(New object(“source”;Folder(fk desktop folder).file(“Images/image.png”)))

$destination:=Folder(fk desktop folder).file(“file.zip”)

$oErr:=ZIP Create archive($zip;$destination)

</code 4D>

Merci.

Vous devriez rajouter cela en exemple dans https://doc.4d.com/4Dv18/4D/18/ZIP-Creer-archive.301-4672146.fr.htmlla doc> :idea: et corriger l’exemple N°2 qui est erroné
(le passage de paramètre n’est pas correct). :pray:

Voici la correction:
<code 4D>
C_OBJECT($folder;$destination;$status)

$destination:=Folder(fk desktop folder).file(“MyDocs/Images.zip”)
$folder:=Folder(fk desktop folder).folder(“MyDocs/Images”)

$status:=ZIP Create archive($folder;$destination;ZIP Without enclosing folder)

</code 4D>

Bernard,
To expand on Vanessa’s reply also notice you can access the contents
of a zipped file without having to extract it to a disk file. From the
docs:

Code :
$path:=Folder(fk desktop folder).file(“MyDocs/Archive.zip”)
$archive:=ZIP Read archive($path)
$files:=$archive.root.files()

To read the contents of a file without extracting it from the root
folder:

Code :
If($files[$i].extension=".txt")
$txt:=$files[$i].getText()
Else
$blob:=$files[$i].getContent()
End if

I have played with this and it is very fast. This gives us the option to provide a number of resources in a single archive, as you are doing, and then extract only the one required.

: Bernard ESCAICH

J’ai utilisé autrefois des applications de zippage qui permettaient
l’ajout de fichiers.

J’ai cherché, j’y ai cru en lisant https://doc.4d.com/4Dv18/4D/18/A-propos-des-archives-ZIP.300-4679649.fr.htmlcette partie de la doc>, mais, non, visiblement on ne peut pas rajouter des fichiers dans une archive préexistante… :frowning:

: Kirk BROOKS

To expand on Vanessa’s reply also notice you can access the contents
of a zipped file without having to extract it to a disk file. From
the docs:

Thanks Kirk, I saw that.

: Vanessa TALBOT

Vous pouvez passez une collection de fichiers et de dossiers à
compresser à l’object ‘zipStructure’.

Ça marche (qui a dit enfin ?).
J’ai les moyens de faire ce que je veux.

Au lieu de passer des objets File() dans une collection, je voulais extraire la liste des fichiers par Folder().files(), ajouter un sélecteur et réduire la sélection avec ce sélecteur.
Les objets File() n’étant pas modifiables *, je les ai copiés et mis dans la collection passée en paramètre mais ils ne sont pas reconnus ; ils doivent avoir des propriétés cachées…
Dommage que 4D n’aime pas le Canada Dry, c’est donc une suggestion d’amélioration.

*on a eu le débat dans un https://forums.4d.com/Post/EN/32986281/2/33094120#33094120autre fil>

Si je zippe :
MonDD
.dossier1
…fichier1
…fichier2
.dossier2
…fichier4
…fichier5

J’obtiens
MonFichierZippé
.MonDD
…dossier1
…fichier1
…fichier2
…dossier2
…fichier4
…fichier5

Cela peut me convenir dans certaine situations mais d’antres cas, je voudrais avoir
MonFichierZippé
.fichier1
.fichier2
.fichier4
.fichier5

Manuel va encore dire que je ne sais pas lire mais j’ai différents essais infructueux avec le paramètre ‘destination’ : j’ai essayé une chaine vide, le nom du fichier, le nom du fichier précédé d’un répertoire à créer.
Rien, nada…
Il faudrait que la doc soit plus explicite…

L’option ZIP Without enclosing folder ne change rien non plus.

are you sure you removed the plugin?

you don’t want its constants interfere with those of native commands

https://raw.githubusercontent.com/miyako/4d-plugin-zip/master/zip/constants.xlf

https://doc.4d.com/4Dv18/4D/18/ZIP-Create-archive.301-4672146.en.html

: Keisuke MIYAKO

are you sure you removed the plugin?

I didn’t install it.

Ça fonctionne cette fois-ci ; je me suis mélangé dans la position des options.
Merci pour votre aide.