Trouver et effacer les fichiers de langue inutiles

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Trouver et effacer les fichiers de langue inutiles

Message par cage »

Bonsoir a tous,

Depuis de nombreuses années, je fais le ménage dans les fichiers de langue que je n'utilise pas dans les logiciels que j'utilise.
Cela peut représenter plus d'un millier de fichiers et plusieurs dizaines de Mo d'espace disque.
Quand j'ai commencé a utiliser PB, je me suis créé un utilitaire pour automatiser la recherche, l'affichage et éventuellement l'effacement de ces fichiers.
Voici le code très simplifié qui fonctionne directement dans l'IDE de PB et dont j'ai retiré tout ce qui est log, demande de confirmation et effacement des fichiers.
Tous les programmes listés dans ce code n'ont aucun problème de fonctionnement une fois les fichiers des langues non utilisés effacés.
Ce code utilise une DataSection pour lister les fichiers.
Dans mon application, les datas sont contenus dans un fichier externe lu au démarrage pour nourrir la DataSection.
Afin d'améliorer ce bout de code, n'hésitez a le critiquer (dans le bon sens du terme)
Merci.

Code : Tout sélectionner

EnableExplicit

OnErrorGoto(?ErrorHandler)

;; https://www.science.co.il/language/Locale-codes.php
;; en en-us 0x0409 1033 English - United States
;; fr fr-fr 0x040C 1036 French  - France

Global PF1$ = "C:\Program Files\"
Global PF2$ = "C:\Program Files (x86)\"
Global ADL$ = "C:\Users\admin\AppData\Local\"
Global ADR$ = "C:\Users\admin\AppData\Roaming\"

DataSection
  ListeApplications:
  Data.s "DesktopCal\language                       !*.xml !eng.xml|fra.xml"
  Data.s "Spotify\locales                           !*.mo  !en.mo|fr.mo|fr-CA.mo"
  Data.s "Spotify\locales                           !*.pak !en-GB.pak|en-US.pak|fr.pak"
  
  Data.s "Molotov\app-3.1.0\locales                 !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Programs\metube\locales                   !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Programs\somafm\locales                   !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Programs\youtube-music-desktop-app\locales!*.pak !en-GB.pak|en-US.pak|fr.pak"
  
  Data.s "CCleaner\Lang                             !*.dll !lang-1033.dll|lang-1036.dll"
  Data.s "Defraggler\Lang                           !*.dll !lang-1033.dll|lang-1036.dll"
  Data.s "Recuva\Lang                               !*.dll !lang-1033.dll|lang-1036.dll"
  Data.s "Speccy\Lang                               !*.dll !lang-1033.dll|lang-1036.dll"
  ;
  Data.s "adslTV\VLC\locale                         !*.*   !en_GB|fr"
  Data.s "VideoLAN\VLC\locale                       !*.*   !en_GB|fr"
  ;
  Data.s "AirLiveDrive\Language                     !*.xaml!strings_en-GB.xaml|strings_en-US.xaml|strings_fr-FR.xaml"
  Data.s "Alt-Tab Terminator\lang                   !*.xml !French.xml"
  Data.s "Bandizip\langs                            !*.ini !English.ini|French.ini"
  Data.s "CherryPlayer\languages                    !*.ini !english.ini|french.ini"
  Data.s "DVBViewer\Language                        !*.lng !English.lng|French.lng"
  Data.s "FreeFileSync\Languages                    !*.lng !english_uk.lng|french.lng"
  Data.s "Honeyview\langs                           !*.ini !English.ini|French.ini"
  Data.s "Icecream PDF Editor\translations          !*.qm  !icepdfeditor_en.qm|icepdfeditor_fr.qm"
  Data.s "Icecream PDF Split and Merge\translations !*.ini !icecreamshell_en.ini|icecreamshell_fr.ini"
  Data.s "Icecream PDF Split and Merge\translations !*.qm  !pdftool_en.qm|pdftool_fr.qm"
  Data.s "JustRadio\Locales                         !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "KC Softwares\SUMo                         !*.spk !SUMo_00000409.SPK|SUMo_0000040C.SPK"
  Data.s "MPC-BE\Lang                               !*.dll !mpcresources.fr.dll"
  Data.s "MPC-HC\Lang                               !*.dll !mpcresources.en_GB.dll|mpcresources.fr.dll"
  Data.s "MyPhoneExplorer\languages                 !*.lng !English.lng|French.lng"
  Data.s "TomTom HOME 2\Translations                !*.*   !en_GB|en_US|fr"
  Data.s "Vistumbler\Languages                      !*.ini !English.ini|French.ini"
  Data.s "Wise\Wise Force Deleter\Languages         !*.ini !English.ini|French.ini"
  Data.s "Wise\Wise JetSearch\Languages             !*.ini !English.ini|French.ini"
  Data.s #Null$
EndDataSection

Procedure searchLang()
  Protected ligne$
  Protected separateur$="!"
  Protected dossier$, fichier$, langue$, modele$
  Protected count, n, taille, tailleTotale, nombreDeFichiers
  
  Restore ListeApplications
  
  Repeat
  Read.s ligne$
    If ligne$ <> #Null$
      count = CountString(ligne$, separateur$)
      If count
        dossier$ = Trim(StringField(ligne$,1,separateur$)) ;: Debug "Dossier: "+dossier$
        modele$  = Trim(StringField(ligne$,2,separateur$)) ;: Debug "Modéle: " +modele$
        langue$  = Trim(StringField(ligne$,3,separateur$)) ;: Debug "Langue: " +langue$ : Debug ""
      Else
        Continue
      EndIf
      NewList folder.s()
      AddElement(folder())
        folder() = PF1$ + dossier$ + "\"
      AddElement(folder())
        folder() = PF2$ + dossier$ + "\"
      AddElement(folder())
        folder() = ADL$ + dossier$ + "\"
      AddElement(folder())
        folder() = ADR$ + dossier$ + "\"
      ForEach folder()
        If ExamineDirectory(0, folder(), modele$)
          Debug UCase(folder()) : Debug ""
          While NextDirectoryEntry(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_File
              fichier$ = DirectoryEntryName(0)
              If Not FindString(langue$, fichier$, 1, #PB_String_NoCase)
                taille = FileSize(folder()+fichier$)
                tailletotale + taille
                nombredefichiers + 1
                Debug folder()+fichier$+" ---> "+taille
              EndIf
            EndIf
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              dossier$ = DirectoryEntryName(0)
              Select Left(LCase(dossier$), 12)
                Case ".", ".."
                Default
                  If Not FindString(langue$, dossier$, 1, #PB_String_NoCase)
                    If ExamineDirectory(1, folder()+dossier$, "*.*")
                      While NextDirectoryEntry(1)
                        If DirectoryEntryType(1) = #PB_DirectoryEntry_File
                          fichier$ = DirectoryEntryName(1)
                          taille = FileSize(folder()+dossier$+"\"+fichier$)
                          tailletotale + taille
                          nombredefichiers + 1
                          Debug folder()+dossier$+"\"+fichier$+" ---> "+taille
                        EndIf
                      Wend
                    EndIf
                  EndIf
              EndSelect
            EndIf
          Wend
          Debug ""
          FinishDirectory(0)
        EndIf
      Next
    EndIf
  Until ligne$ = #Null$
  Debug "NOMBRE DE FICHIERS : " + NOMBREDEFICHIERS
  Debug ""
  Debug "TAILLE TOTALE: " + FormatNumber(TAILLETOTALE,3,".",".")
  Debug ""
EndProcedure

searchLang()

ErrorHandler:
End
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Trouver et effacer les fichiers de langue inutiles

Message par MLD »

@cage
Surprenant et intéressant.
Merci du partage
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Trouver et effacer les fichiers de langue inutiles

Message par Ar-S »

C'est pas mal ça merci.

Note : Pour être sûr de ne pas virer le mauvais DLL de chez Piriform (xx1036.dll) on peut les ouvrir avec 7zip.
Ensuite ou ouvre le txt du dossier .rsrc
~~~~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
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Trouver et effacer les fichiers de langue inutiles

Message par cage »

Bonjour,

Pour être au plus prêt de la réalité au niveau de l'espace disque utilisé, j'utilise la procédure diskSize(size)
Pour Molotov, comme le dossier comporte le numéro de version, j'utilise un artifice.
D'autres logiciels changent de nom de dossier a chaque mise à jour majeure.
J'utilise le même principe que pour Molotov afin de trouver ce nom de dossier.

Code : Tout sélectionner

EnableExplicit

OnErrorGoto(?ErrorHandler)

Define USERNAME$ = UserName()

;; https://support.microsoft.com/fr-fr/help/140365/default-cluster-size-for-ntfs-fat-and-exfat
;; https://www.science.co.il/language/Locale-codes.php
;; en en-us 0x0409 1033 English - United States
;; fr fr-fr 0x040C 1036 French  - France

Global PF1$ = "C:\Program Files\"
Global PF2$ = "C:\Program Files (x86)\"
Global ADL$ = "C:\Users\"+USERNAME$+"\AppData\Local\"
Global ADR$ = "C:\Users\"+USERNAME$+"\AppData\Roaming\"

Global appmolotov$
Define MOLOTOVPATH$ = ADL$+"Molotov\"
Define NEWFOLDER$, OLDFOLDER$

If ExamineDirectory(0, MOLOTOVPATH$, "app*.*")
  While NextDirectoryEntry(0)
    If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
      NEWFOLDER$ = DirectoryEntryName(0)
      If NEWFOLDER$ <> OLDFOLDER$
        Select Left(LCase(NEWFOLDER$), 12)
          Case ".", ".."
          Default
            appmolotov$ = NEWFOLDER$ ;: Debug NEWFOLDER$
        EndSelect
      EndIf
      OLDFOLDER$ = NEWFOLDER$
    EndIf
  Wend
  FinishDirectory(0)
Else
  appmolotov$ = "app-3.1.0"
EndIf

DataSection
  ListeApplications:
  Data.s "DesktopCal\language                       !*.xml !eng.xml|fra.xml"
  Data.s "Spotify\locales                           !*.mo  !en.mo|fr.mo|fr-CA.mo"
  Data.s "Spotify\locales                           !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Molotov\app-x.x.x\locales                 !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Programs\metube\locales                   !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Programs\somafm\locales                   !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "Programs\youtube-music-desktop-app\locales!*.pak !en-GB.pak|en-US.pak|fr.pak"
  
  Data.s "CCleaner\Lang                             !*.dll !lang-1033.dll|lang-1036.dll"
  Data.s "Defraggler\Lang                           !*.dll !lang-1033.dll|lang-1036.dll"
  Data.s "Recuva\Lang                               !*.dll !lang-1033.dll|lang-1036.dll"
  Data.s "Speccy\Lang                               !*.dll !lang-1033.dll|lang-1036.dll"
  ;
  Data.s "adslTV\VLC\locale                         !*.*   !en_GB|fr"
  Data.s "VideoLAN\VLC\locale                       !*.*   !en_GB|fr"
  ;
  Data.s "AirLiveDrive\Language                     !*.xaml!strings_en-GB.xaml|strings_en-US.xaml|strings_fr-FR.xaml"
  Data.s "Alt-Tab Terminator\lang                   !*.xml !French.xml"
  Data.s "Bandizip\langs                            !*.ini !English.ini|French.ini"
  Data.s "CherryPlayer\languages                    !*.ini !english.ini|french.ini"
  Data.s "DVBViewer\Language                        !*.lng !English.lng|French.lng"
  Data.s "FreeFileSync\Languages                    !*.lng !english_uk.lng|french.lng"
  Data.s "Honeyview\langs                           !*.ini !English.ini|French.ini"
  Data.s "Icecream PDF Editor\translations          !*.qm  !icepdfeditor_en.qm|icepdfeditor_fr.qm"
  Data.s "Icecream PDF Split and Merge\translations !*.ini !icecreamshell_en.ini|icecreamshell_fr.ini"
  Data.s "Icecream PDF Split and Merge\translations !*.qm  !pdftool_en.qm|pdftool_fr.qm"
  Data.s "JustRadio\Locales                         !*.pak !en-GB.pak|en-US.pak|fr.pak"
  Data.s "KC Softwares\SUMo                         !*.spk !SUMo_00000409.SPK|SUMo_0000040C.SPK"
  Data.s "MPC-BE\Lang                               !*.dll !mpcresources.fr.dll"
  Data.s "MPC-HC\Lang                               !*.dll !mpcresources.en_GB.dll|mpcresources.fr.dll"
  Data.s "MyPhoneExplorer\languages                 !*.lng !English.lng|French.lng"
  Data.s "TomTom HOME 2\Translations                !*.*   !en_GB|en_US|fr"
  Data.s "Vistumbler\Languages                      !*.ini !English.ini|French.ini"
  Data.s "Wise\Wise Force Deleter\Languages         !*.ini !English.ini|French.ini"
  Data.s "Wise\Wise JetSearch\Languages             !*.ini !English.ini|French.ini"
  Data.s #Null$
EndDataSection

Procedure diskSize(size)
;; https://support.microsoft.com/fr-fr/help/140365/default-cluster-size-for-ntfs-fat-and-exfat
  Protected cluster.f
  Protected clustersize = 4096
  If size = 0 : size = clustersize : EndIf
  cluster = size / clustersize                ;: Debug cluster
  cluster = Int(Round(cluster, #PB_Round_Up)) ;: Debug cluster
  size = clustersize * cluster
  ProcedureReturn size
EndProcedure

Procedure searchLang()
  Protected ligne$
  Protected separateur$="!"
  Protected dossier$, fichier$, langue$, modele$
  Protected count, taille, tailleTotale, nombreDeFichiers
  
  Restore ListeApplications
  
  Repeat
  Read.s ligne$
    If ligne$ <> #Null$
      count = CountString(ligne$, separateur$)
      If count
        dossier$ = Trim(StringField(ligne$,1,separateur$)) : Debug "Dossier: "+dossier$
        modele$  = Trim(StringField(ligne$,2,separateur$)) ;: Debug "Modéle: " +modele$
        langue$  = Trim(StringField(ligne$,3,separateur$)) ;: Debug "Langue: " +langue$ : Debug ""
        If LCase(Left(dossier$, 8)) = "molotov\"
          dossier$ = ReplaceString(dossier$, "app-x.x.x", appmolotov$, #PB_String_NoCase)
          Debug dossier$
        EndIf
      Else
        Continue
      EndIf
      NewList folder.s()
      AddElement(folder())
        folder() = PF1$ + dossier$ + "\"
      AddElement(folder())
        folder() = PF2$ + dossier$ + "\"
      AddElement(folder())
        folder() = ADL$ + dossier$ + "\"
      AddElement(folder())
        folder() = ADR$ + dossier$ + "\"
      ForEach folder()
        If ExamineDirectory(0, folder(), modele$)
          Debug UCase(folder()) : Debug ""
          While NextDirectoryEntry(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_File
              fichier$ = DirectoryEntryName(0)
              If Not FindString(langue$, fichier$, 1, #PB_String_NoCase)
                taille = FileSize(folder()+fichier$)
                taille = diskSize(taille) ; <--- AJOUT
                tailletotale + taille
                nombredefichiers + 1
                Debug folder()+fichier$+" ---> "+FormatNumber(taille,0,",",".")+" octets"
              EndIf
            EndIf
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              dossier$ = DirectoryEntryName(0)
              Select Left(LCase(dossier$), 12)
                Case ".", ".."
                Default
                  If Not FindString(langue$, dossier$, 1, #PB_String_NoCase)
                    If ExamineDirectory(1, folder()+dossier$, "*.*")
                      While NextDirectoryEntry(1)
                        If DirectoryEntryType(1) = #PB_DirectoryEntry_File
                          fichier$ = DirectoryEntryName(1)
                          taille = FileSize(folder()+dossier$+"\"+fichier$)
                          taille = diskSize(taille) ; <--- AJOUT
                          tailletotale + taille
                          nombredefichiers + 1
                          Debug folder()+dossier$+"\"+fichier$+" ---> "+FormatNumber(taille,0,",",".")+" octets"
                        EndIf
                      Wend
                    EndIf
                  EndIf
              EndSelect
            EndIf
          Wend
          Debug ""
          FinishDirectory(0)
        EndIf
      Next
    EndIf
  Until ligne$ = #Null$
  TAILLETOTALE = diskSize(TAILLETOTALE) ; <--- AJOUT
  Debug "NOMBRE DE FICHIERS : " + NOMBREDEFICHIERS
  Debug ""
  Debug "TAILLE TOTALE: " + FormatNumber(TAILLETOTALE,0,",",".")+" octets"+" soit "+FormatNumber(TAILLETOTALE/1024,0,",",".")+ " Ko"
  Debug ""
EndProcedure

searchLang()

ErrorHandler:
End
Dernière modification par cage le jeu. 21/mars/2019 14:17, modifié 1 fois.
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Trouver et effacer les fichiers de langue inutiles

Message par cage »

@Ar-S
Note : Pour être sûr de ne pas virer le mauvais DLL de chez Piriform (xx1036.dll) on peut les ouvrir avec 7zip.
Ensuite ou ouvre le txt du dossier .rsrc
Je connaissais l'astuce, mais l'ouverture de string.txt du dossier .rsrc ne me donne que des caractères bizarres.
J'utilise strings.exe de chez Microsoft (live.sysinternals.com) pour voir la langue utilisée dans la dll
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Trouver et effacer les fichiers de langue inutiles

Message par Ar-S »

Chez moi aucun soucis en l'ouvrant avec NP++ ni même avec le bloc-note. Étrange.
~~~~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
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Trouver et effacer les fichiers de langue inutiles

Message par cage »

Bonjour a tous,

Une version plus aboutie est disponible sur cette page
Image

Image
Seules les sources sont disponibles, les exécutables viendront une fois le projet abouti.
Quelques commandes:
La touche Escape minimise l'application
CTRL+S sélectionne toutes les cases a cocher de la liste des programmes
CTRL+D désélectionne toutes les cases...
Voir aussi le menu Programmes
F1 affiche le message About
Un double clic sur une ligne de le liste des programmes ouvre le dossier dudit programme s'il existe.
Le bouton Afficher les programmes affiche la liste
Le bouton Rechercher les fichiers locales lance la recherche des locales des programmes cochés.
Une fois la recherche effectuée, 2 boutons supplémentaires s'affichent.
Le bouton Enregistrer la liste des locales permet d'enregistrer le résultat de la recherche.
Le bouton Effacer les fichiers locales permet d'effacer les fichiers trouvés.
Par précaution, la constante #confirm est positionnée a #False au début du code.
On peut donc faire tous les tests que l'on souhaite sans risque.
Pour pouvoir vraiment effacer les fichiers, il faudra indiquer #confirm=#True
Le menu Utilisateur permet de sélectionner l'utilisateur pour lequel effectuer une recherche de programme.
Pour pouvoir réellement effacer les fichiers, l'application doit donc être lancée en admin.
Dans ce cas, l'utilisateur n'est plus celui qui a lancé le programme, mais "admin".

Je suis conscient que l'application n'est pas vraiment aboutie, je compte donc sur vos remontées.
Si vous pouviez aussi compléter la liste des programmes avec les vôtres qui n'y seraient pas déjà, ce serait cool.

Si vous êtes arrivez là, merci a vous de m'avoir lu.

CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Répondre