Question [MAJ V1.1][Module] Gestion des zip (IOnic.Zip.dll)

Plus d'informations
il y a 11 ans 3 mois #13517 par SiSMik
ça brainstorm à fond ici ;)

J'ai pas testé ce module, actuellement je bidouille avec les objets COM pour unzip mes fichiers, et j'ai un truc qui me manque cruellement, peut être ce module avec ionic le fait.

En fait dans winrar (par exemple) il est possible de déziper une archive avec l'action \"Extraire ici\" ce qui ne rajoute pas un dossier enfant. C'est possible ça ?

(Pas sur d'avoir été assez clair)

Bonne soirée !

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #13519 par Laurent Dardenne
benduru écrit:

En fait dans winrar (par exemple) il est possible de déziper une archive avec l'action \"Extraire ici\" ce qui ne rajoute pas un dossier enfant. C'est possible ça ?

Je pense, l'extraction se fait dans le répertoire indiqué, reste à déterminier comment gérer les fichiers existant.

Je pensais justement orienter le code de ce module pour faciliter ce type d'usage via l'exploreur. Mais ça c'est un autre développement , créer des entrées de menu contextuel via PS.

Le fichier joint contient un exemple codé en Delphi, il reste à enregistrer la dll avec Regsrv)

La pièce jointe tools.zip est absente ou indisponible

<br><br>Message édité par: Laurent Dardenne, à: 4/01/13 10:01

Tutoriels PowerShell
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #13521 par Matthew BETTON
Salut,

Laurent Dardenne écrit:

Je peux prendre en charge la version Fr.
Le mieux est d'utiliser des fichiers Maml (xml). Je regarde ça.


Ok ;)

Je réfléchissais à modifier le prg console pour prendre en charge le pipeline, c'est, pour un usage simple, un truc qui, je trouve, manque actuellement.


'Add-ZipContent' prend déjà en charge le pipeline... Mais pas de 'Set-ZipContent'.


Je réfléchis (depuis quelques temps) à la justification de l'existance de Set-ZipContent.
Un Set-ZipContent c'est un Add-ZipContent lorsque l'archive cible n'existe pas encore.:silly:

Seule cette fonctionnalité n'est pas reprise dans le code de 'Add-ZipContent' :

[code:1]Set-ZipContent -Source \&quot;D:\File.dat\&quot; -Destination \&quot;D:\MyZipFile.zip\&quot; -Force[/code:1]

=&gt; Indique que si l'archive existe déjà, elle est écrasée.

Si 'Set-ZipContent' est finalement supprimée, il faudra alors se poser la question du nommage de la Cmdlet 'Add-ZipContent'.

Je regarde ça demain ou ce WE.
J'ai aussi 1 ou 2 remarques sur tes posts précédents, mais je n'ai pas pris le temps d'y répondre.


Ok pas de souci, merci.

Tous ne sont peut être pas pertinents...
Je te rassure c'est pas à toi de le faire :laugh:


Je participe et je suis content :laugh:

Pour certaines fonctionnalités, elles sont déjà présentes dans le module :

Add-Zipcontent
Créer une archive à partir :
-d'un fichier
-de + fichiers
-d'un répertoire
-de + répertoires
-d'une liste de fichiers ('multidrives')

Get-ZipContent
Afficher le contenu de l'archive

Pour cette fonctionnalité : Extraire une entrée (fichier/répertoire) d'une archive
L'idée est de passer par Get-ZipContent sans le paramètre '-List' =&gt; Dans ce cas, ce sont des objets [Ionic.Zip.ZipEntry] qui sont renvoyés.
Et là c'est youpi, parce que cet objet dispose de la méthode 'extract()'.

@ +

Matthew

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #13522 par Matthew BETTON
Laurent Dardenne écrit:

benduru écrit:

En fait dans winrar (par exemple) il est possible de déziper une archive avec l'action \&quot;Extraire ici\&quot; ce qui ne rajoute pas un dossier enfant. C'est possible ça ?

Je pense, l'extraction se fait dans le répertoire indiqué, reste à déterminier comment gérer les fichiers existant.


Oui c'est déjà le cas : c'est le paramètre '-Destination' qui définie le chemin où seront décompressées les données. Un répertoire parent portant le nom de l'archive n'est pas généré. Dans ce dernier cas, c'est plutôt à celui qui utilises la Cmdlet Expand-Zip de créer ce répertoire avant extraction...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #13526 par SiSMik
Bon bah je vais peut être voir à utiliser ton module dans mes prochains developpements :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 3 mois #13537 par Laurent Dardenne
Matthew BETTON écrit:

Une solution ?

Oui sur la forme, non sur le fond, car à la lecture de la doc il existe qq régles de comportement à respecter.
Ceci dit, pour la gestion de l'énumération il faut coupler le paramètre avec des attributs :
[code:1]
[Parameter(Mandatory=$true)]
[ValidateNotNull()]
[Ionic.Zip.EncryptionAlgorithm]$DataEncryption,
[/code:1]
Ainsi on est assuré d'avoir une valeur différente de nulle.
Et si on souhaite respecter le comportement on doit procéder autremement. En même temps manquant de recul sur la connaissance et l'usage de cette librairie je reste prudent sur cette appproche :
[code:1]
Function Set-ZipObjectEncryption {
# .ExternalHelp IonicZip-Help.xml
[CmdletBinding(DefaultParameterSetName = \&quot;Set\&quot;«»)]
param(
[Parameter(Position=0,Mandatory=$true)]
[ValidateNotNull()]
[Ionic.Zip.ZipFile]$zipObject,
[Parameter(Position=1,ParameterSetName=\&quot;Set\&quot;«»)]
[Ionic.Zip.EncryptionAlgorithm]$DataEncryption,
[Parameter(Position=2,ParameterSetName=\&quot;Set\&quot;«»)]
[String]$Password,
[Parameter(ParameterSetName=\&quot;Reset\&quot;«»)]
[switch] $Reset
)

Write-Debug \&quot;Setting encryption for Zip file archive $($zipObject.Name)\&quot;

try {
if ($Reset)
{ $zipObject.Password = $null } # -&gt; Encryption = None
else
{
$isPwdValid= [string]::IsNullOrEmpty($Password) -eq $false
$isEncryptionValid=$DataEncryption -ne $null

If ($isPwdValid -and -not $isEncryptionValid)
{
$zipObject.Encryption = \&quot;Weak\&quot;
$zipObject.Password = $Password
}
elseif (-not $isPwdValid -and -not $isEncryptionValid)
{ $zipObject.Password = $null } #Encryption = None -&gt; Reset
elseif ($DataEncryption -ne \&quot;None\&quot;«»)
{
if ($isPwdValid)
{ Throw \&quot;The parameter password is not valid for the value of DataEncryption : $DataEncryption.\&quot;}
$zipObject.Encryption = $DataEncryption
$zipObject.Password = $Password
}
else
{ $zipObject.Password = $null } #Encryption = None -&gt; Reset
}
}
catch{
throw \&quot;An error has occured while setting encryption for Zip file archive $($zipObject.Name) : $($_.Exception.Message)\&quot;
}
Return $zipObject
}#Set-ZipObjectEncryption
[/code:1]
A tester.
Matthew BETTON écrit:

Est-ce inadapté, lorsqu'on utilise un Manifeste, de continuer à utiliser la Cmdlet 'Export-ModuleMember' ?

Par expérience, dans ce cas faire simple en utilisant uniquement le Cmdlet 'Export-ModuleMember'.
Matthew BETTON écrit:

Dans la console, on perd la fonctionnalité d'auto complétion des valeurs possibles pour le paramètre '-Encryption'

Il faut propager l'usage de l'énumération sur le paramètre -Encryption de la méthode Set-ZipContent.
Matthew BETTON écrit:

Un avis sur cette première solution ?

Le test suivant :
[code:1]
if(-not (Test-Path $p)){
[/code:1]
me semble suffisant car la liaison de paramètre transforme l'objet en string :
[code:1]
$S=Get-Service
Trace-Command ParameterBinding {Test-Path $s[0]} -PSHost
[/code:1]
Donc, laisser PS faire le boulot, sous réserve de connaitre un peu comment il le fait et ne pas oublier les breaking change si on cible la V3...
Et pour ce code :
[code:1]
elseif($p -is [System.IO.FileInfo] -or $p -is [System.IO.DirectoryInfo]){
[/code:1]
Il faut rechercher la classe ancêtre commune (approche POO) :
[code:1]
$f=dir
$f[0]
$f[0].PSObject.typenames
$f[-1].PSObject.typenames
[/code:1]
Ensuite utiliser une méthode de la classe Type:
[code:1]
$F[0].GetType().Fullname
if ($F[0].GetType().IsSubclassOf([System.IO.FileSystemInfo])
{\&quot;Ok\&quot;}
else {\&quot;Nok\&quot;}

$F[-1].GetType().Fullname
if ($F[-1].GetType().IsSubclassOf([System.IO.FileSystemInfo])
{\&quot;Ok\&quot;}
else {\&quot;Nok\&quot;}
[/code:1]
Matthew BETTON écrit:

Je réfléchis (depuis quelques temps) à la justification de l'existance de Set-ZipContent.

C'est, pour moi, un peu prématuré de répondre.
Matthew BETTON écrit:

Si 'Set-ZipContent' est finalement supprimée, il faudra alors se poser la question du nommage de la Cmdlet 'Add-ZipContent'.

New et Add ?
Il faut distinguer l'usage et l'implémentation.
Matthew BETTON écrit:

Et là c'est youpi, parce que cet objet dispose de la méthode 'extract()'.

Ici, et comme dit précédemment, l'usage doit primer. L'utilisateur, si j'ai bien compris, n'a pas à connaitre, tant que faire ce peut, l'implémentation de l'objet.
Et si besoin, ce serait pour un usage avancé ou une impossibilté de simplifier.
Pourquoi ne pas envisager un :
[code:1]
Extract-Zip *.ps1,*.ps1xml
[/code:1]
Aujourd'hui je ne pense pas que la difficulté/questionnement soit dans l'implémentation de ce Wrapper, mais dans l'articulation (+- les combinaisons) des fonctions avancées répondant aux fonctionnalités proposées.
Questionnement rencontré lors de l'écriture de ce Wrapper .

Il est possible de concevoir au delà des besoins énoncés, sans pour autant tout implémenter.
Je trouve ce projet très intéressant et pour qu'il le reste je pense qu'il est nécessaire de revoir cette base, ce point étant renforcé par tes dernières interrogations. Et mes remarques précédentes ont peut être induit cette situation...
Dans un premier temps, un simple write-host \&quot;Je fais telle action\&quot; suffira, je pense, pour valider l'articulation. Le plus important, il me semble, est le \&quot;parameter binding\&quot;, la liaison de paramètres, que j'appelle ici 'articulation'.

Je suis donc plus orienté aujourd'hui sur le quoi proposer comme service autour de la manipulation d'une archive que sur comment le faire. Car sur ce dernier point, et comme je te l'ai dit, je trouve que la DLL est vraiment bien conçue.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.110 secondes
Propulsé par Kunena