Changer les noms de fichiers avec accents

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Changer les noms de fichiers avec accents

Message par Jacobus »

'AddPackFile' and 'AddPackMemory' do not set the UTF8-Filename bit in the archive in case the filename is stored as UTF8 >> not all ZIP engines can decrypt the filenames correctly (e.g. windows 8.1 zip engine relies on this utf8-flag in the archive)
Trouvé sur le forum en.
Donc pour utiliser le ZIP et le UNZIP, il vaut mieux effectivement supprimer les accents des noms de fichiers.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Changer les noms de fichiers avec accents

Message par Marc56 »

Oui, cela dit c'est moteur zip de Windows qui n'est pas assez polyvalent :( , car les autres arrivent à lire les zip créés avec PB même ceux avec accents.

Code : Tout sélectionner

UseZipPacker()  
SetCurrentDirectory(GetTemporaryDirectory())

F_Name$ = "Accents éèàç . et 1€.txt"
Z_Name$ = "Fichier archivé pour même pas 1€.zip"

DeleteFile(F_Name$)
DeleteFile(Z_Name$)

OpenFile(0, F_Name$) 
WriteString(0, "Hello World")
CloseFile(0)

If CreatePack(0, Z_Name$, #PB_PackerPlugin_Zip)
    AddPackFile(0, F_Name$, F_Name$)    
    ClosePack(0)  
    Debug "OK"
    Debug FormatNumber(FileSize(Z_Name$), 0) + " octets"
Else
    Debug "KO"
EndIf

RunProgram(Z_Name$)
RunProgram("C:\Program Files\7-Zip\7zFM.exe", "", "")
Comme la licence 7zip permet l'intégration et l'utilisation même pour les programmes commerciaux (à condition de citer le copyright) je préfère utiliser ce dernier. On peut l'utiliser sans l'installer, il suffit de packager l'un des 3 exe. Pour les longues opérations d'archivage, je me sert de 7zG.exe à la place de 7z.exe car il affiche ainsi une fenêtre avec barre de progression, statistiques et commandes d'arrêt. C'est très utile.
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Changer les noms de fichiers avec accents

Message par Jacobus »

C'est en effet très utile et ça simplifie la vie :)
Juste un beans que je ne comprends pas, peut-être sauras-tu me dire pourquoi cela a bien fonctionné une fois et qu'à chaque nouvelle tentative j'ai le message d'erreur "7zip cannot find archive" ?
Avec la procédure suivante, appliquée sur un ExplorerListGadget():

Code : Tout sélectionner

Pos = GetGadgetState(#Explorer_ZipArchive)
          If Pos >= 0          
            Resultat = GetGadgetItemState(#Explorer_ZipArchive, Pos)
              If Resultat & #PB_Explorer_Selected
                
                ZipFile$        = GetGadgetItemText(#Explorer_ZipArchive, Pos)
                ZipDirectory$   = GetGadgetText(#Explorer_ZipArchive)
              ;  DirectorySaved$ = GetGadgetText(#Explorer_ZipArchive)+GetGadgetItemText(#Explorer_ZipArchive, Pos)  
               
                ; cette première forme d'appel a parfaitement fonctionnée, tout a été correctement décompressé dans le répertoire de travail
                ; une deuxièmre tentative a échouée avec une autre archive ou la même.                 
                RunProgram("C:\Program Files\7-Zip\7zG.exe","e "+ZipFile$, ZipDirectory$)
                
               ; ci-dessous, c'est sensé décompresser dans le répertoire au nom de l'archive, mais rien que le message d'erreur...
               ; RunProgram("C:\Program Files\7-Zip\7zG.exe","x "+GetGadgetItemText(#Explorer_ZipArchive, Pos)+" -o*", GetGadgetText(#Explorer_ZipArchive))
                
              EndIf 
            EndIf 
Je suppose que j'ai omis un argument mais je ne vois pas lequel. (sinon quand ça veut fonctionner, c'est top!)
Si tu as une idée sur ce que j'ai oublié, merci de me montrer où je merdoie.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Changer les noms de fichiers avec accents

Message par Marc56 »

Je crois que c'est encore une question du "répertoire courant" qui change plus ou moins indépendamment des programmes.
(comme l'OpenFileRequester qui s'ouvre où il veut et mémorise la dernière position)

Essayes de forcer le répertoire de travail, si ce n'est déjà fait.

Code : Tout sélectionner

          SetCurrentDirectory(ZipDirectory$)
Et/ou pour RunProgram, utilises l'output dir de 7zip à la place du paramètre 3 de RunProgram
Remplaces:

Code : Tout sélectionner

          RunProgram("C:\Program Files\7-Zip\7zG.exe",
                     "e " + 
                     ZipFile$, ZipDirectory$)
Par:

Code : Tout sélectionner

          RunProgram("C:\Program Files\7-Zip\7zG.exe",
                     "e " + ZipDirectory$ + 
                     "\" + ZipFile$ + 
                     " -o " + 
                     ZipDirectory$, "")
L"\" est peut-être en trop. J'ai pas testé. Fais un affichage de debug.

Attention: GetGadgetItemText() appliqué à l'explorateur renvoie le nom du fichier mais sans le chemin

Pour 7zip, ajouter -o pour forcer un autre répertoire de sortie.
e (Extract) command
Extracts files from an archive to the current directory or to the output directory. The output directory can be specified by -o (Set Output Directory) switch.


:wink:
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Changer les noms de fichiers avec accents

Message par Jacobus »

Bonsoir,
J'ai résolu le souci avec 7z car il refusait d'ouvrir certaines de mes archives. En fait lui aussi a besoin que les noms des fichiers archives aient un format spécial.
Si vous avez un fichier compressé au nom de "archive compressée hier.zip", le fichier ne sera pas trouvé par 7z;
par contre si vous le nommez "archive_compressée_hier.zip" 7zip va le trouver et le décompresser correctement.
Pourquoi ? Parce qu'il ne faut pas d'espace libre entre les caractères du nom. On pourrait donc aussi écrire: "archivecompresséehier.zip"
Ce qui peut se comprendre en regardant simplement les arguments/paramètres qui doivent être passés à la commande, les "espaces" ont une importance.
Après tous ces tests, j'adopte clairement l'intégration de 7zip dans les applications faites avec PB. Ça devient un vrai bonheur de compresser/décompresser des fichiers et des dossiers.

Voici donc une deuxième astuce dans l'astuce en sujet.
Je reprends l'exemple donné plus haut avec un ExplorerListGadget()
Impératif : 7zip doit être installé sur votre PC

Code : Tout sélectionner

;DECOMPRESSER DES ZIP (OU AUTRES) avec 7Z qui affiche une fenêtre de travail avec barre de progression et des options.
Procedure UnzipArchive_7z(Explorer.l)
  
Position = GetGadgetState(Explorer)
If Position >= 0          
  Resultat = GetGadgetItemState(Explorer, Position)
  If Resultat & #PB_Explorer_Selected
    
    ZipFile$        = GetGadgetItemText(Explorer, Position) ; renvoi le nom de l'archive sélectionnée
    
    ZipDirectory$   = GetGadgetText(Explorer) ; renvoi le nom du répertoire actuellement ouvert dans l'explorateur
    
    SetCurrentDirectory(ZipDirectory$) ; important pour indiquer à 7z où il doit travailler/chercher l'archive
    
    ; 2 possibilités :
    
      ; La première, en utilisant la fonction RunProgram() de PB
    
    RunProgram("C:\Program Files\7-Zip\7zG.exe"," e "+ZipFile$+" -o*", ZipDirectory$) ; tous les fichiers sont extraits dans un dossier portant le nom de l'archive SANS les sous répertoires
    
    ; La seconde en utilisant la commande ShellExecute_()
    
   ; ShellExecute_(0,"open","C:\Program Files\7-Zip\7zG.exe"," x "+ZipFile$+" -o*",ZipDirectory$,1) ; tous les fichiers sont extraits dans un dossier portant le nom de l'archive et incluant les sous répertoires
    
  EndIf 
EndIf

EndProcedure 
Explication sur les arguments passés:

- Attention! les espaces ont leur importance (voir la doc de 7z pour choisir la commande à utiliser)

Dans ce paramètre : " e "+ZipFile$+" -o*"
" e " = pour extraire les fichiers de l'archive sans les sous répertoires. Seuls les fichiers sont décompressés.
+ZipFile$+ = ajout du nom de l'archive SANS son chemin complet.
" -o" = le " -" et le "o", indiquent le "OutputDir" (ou dossier de sortie) dans lequel seront décompressés les fichiers.
"*" = indique à 7z qu'il doit créer un dossier au nom de l'archive où seront décompressés les fichiers. C'est le plus simple pour s'y retrouver. l'étoile "*" doit toucher le "o" -> o*

Si vous souhaitez que la décompression intègre les sous-répertoires, remplacez le " e " par un " x ", votre Structure de dossier sera sauvegardée.

Le paramètre : ZipDirectory$
indique à 7z le répertoire courant où se trouve l'archive à décompresser, c'est là qu'il va aller la chercher. Ce qui revient pour lui à écrire le chemin complet de l'archive ou plus exactement que l'archive "ZipFile$" se trouve dans le répertoire "ZipDirectory$";
soit pour l'exemple : GetGadgetText(Explorer)+GetGadgetItemText(Explorer, Position)

Je vous laisse chercher comment faire pour compresser, mais un indice, c'est aussi simple.
Merci Marc56 de t'être penché sur le sujet pour m'apporter tes lumières.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Changer les noms de fichiers avec accents

Message par SPH »

Merci Jacobus pour cette synthèse qui pourrait me servir :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Changer les noms de fichiers avec accents

Message par Marc56 »

On peut utiliser des noms d'archive avec des espaces à condition de l'encapsuler avec des guillemets.
Pour mettre des guillemets dans une chaine PureBasic, on a #DQUOTE$ qui correspond à Chr(34)

Code : Tout sélectionner

; En ligne de commande on écrirait
; "C:\Program Files\7-Zip\7zG.exe" e "archive compressée hier.zip" -oc:\tmp

; En PureBasic on fait
RunProgram("c:\Program Files\7-Zip\7zG.exe", 
           "e " + 
           #DQUOTE$ + 
           "archive compressée hier.zip" + 
           #DQUOTE$ + 
           " -oc:\tmp", 
           "")
Si on spécifie un répertoire de sortie (-o) il faut le coller sans espace
On peut laisser les guillemets tout le temps, ça ne gène pas.

:wink:
Dernière modification par Marc56 le jeu. 07/mai/2020 20:36, modifié 1 fois.
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: Changer les noms de fichiers avec accents

Message par Mindphazer »

Bien vu le #DQUOTE$, moi qui utilisais tout le temps Chr(34), je le note dans un coin de ma tête...
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Changer les noms de fichiers avec accents

Message par Marc56 »

Oui, j'ai aussi tendance à utiliser souvent directement les codes ascii.
J'ai la table imprimée dans la tête depuis le siècle dernier. :lol:
Au moins les principaux: 9 (TAB), 10 (LF) 13 (CR) 34 (") 64 (@) 65... A... 92 (\) utilisé souvent celui-là sur les claviers querty)
Ça permet aussi de passer d'un langage à l'autre sans chercher la table de constantes
:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Changer les noms de fichiers avec accents

Message par Ar-S »

J'avoue que chr(34),10,13 sont encrés aussi. D'ailleurs je préfère taper chr(34) que #DQUOTES$ :mrgreen: ..
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Changer les noms de fichiers avec accents

Message par Naheulf »

Ar-S a écrit :D'ailleurs je préfère taper chr(34) que #DQUOTES$ :mrgreen: ..
Ou sinon en plus explicite tout en passant par chr() :

Code : Tout sélectionner

chr('"')
Pour moi ça fait une différence :
- #DQUOTES$ ou chr('"') : j'ai besoin du caractère "GUILLEMET ANGLAIS", qui se trouve avoir la valeur 34. Mais si on change la table des caractères et qu'on lui donne la valeur 42 c'est pas grave.
- chr(34) : j'ai besoin de la valeur 34 dans une chaîne de caractère, qui se trouve correspondre au caractère "GUILLEMET ANGLAIS". Mais si on change de table des caractères et que ça correspond au caractère "ASTÉRISQUE" c'est pas grave)
Répondre