Page 1 sur 2

[R] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 16:53
par Boulanza
Bonjour,
Je cherche à remplacer une chaîne de caractères de plusieurs fichiers (64 fichiers) qui se trouvent dans un dossier.
#include<Array.au3>
#include"RecFileListToArray.au3"
Local  $hFileOpen = FileOpen("", $FO_OVERWRITE + $FO_BINARY)
$ar_Array = _RecFileListToArray (@TempDir & "\test\", "*.exe;*.dll", 0, 0, 2, 1, "Temp")
$Resultat =_ArrayDisplay($ar_Array, "Liste fichier")  ; Ceci est facultatif, c'est juste pour afficher la liste des fichiers.
$hFileOpen = FileOpen($Resultat, $FO_OVERWRITE + $FO_BINARY)
FileWrite($hFileOpen, '0x13456789789456123')
FileClose($hFileOpen)
Par contre pour un seul fichier ça marche parfaitement voir code ci-dessous:

Local  $hFileOpen = FileOpen("", $FO_OVERWRITE + $FO_BINARY)
        Local $hFileOpen = FileOpen("", $FO_OVERWRITE + $FO_BINARY)
      $hFileOpen = FileOpen(@TempDir & "\test\test.exe", $FO_OVERWRITE + $FO_BINARY)
      HexRemplace()
      Sleep(100)
   
   Func HexRemplace()
   FileWrite($hFileOpen, '0x123456789987654321')
   FileClose($hFileOpen)
EndFunc   ;==>HexRemplace

Merci pour votre aide.
Cordialement.

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 17:14
par walkson
Bonjour,
Il me semble que vous prenez un sacrè raccourci :lol:
$hFileOpen = FileOpen($Resultat, $FO_OVERWRITE + $FO_BINARY)
Si $ar_Array est un array, il faut une boucle pour lire $ar_Array[$i]
$Resultat =_ArrayDisplay($ar_Array, "Liste fichier") => $Resultat = 1

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 17:26
par Boulanza
Bonjour walkson et merci pour votre remarque. Le code ci-dessous, répond à une partie de ma demande, mais pour ajouter la seconde partie qui remplace les fichiers par une une nouvelle chêne de caractères de plusieurs fichiers, je bloque complètement. votre aide serait la bienvenue. Merci
#include<Array.au3>
#include"RecFileListToArray.au3"
$ar_Array = _RecFileListToArray (@TempDir & "\test\", "*.exe;*.dll", 0, 0, 2, 1, "Temp")
$Resultat =_ArrayDisplay($ar_Array, "Liste fichier")
$hFileOpen = FileOpen($Resultat, $FO_OVERWRITE + $FO_BINARY)

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 17:28
par mikell
Le code ci dessus ne répond à rien du tout. Ousqu'elle est la boucle évoquée par walkson ?

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 17:47
par Boulanza
Je bloque pour la réalisation de la boucle évoquée par walkson. Pour une boucle qui fonctionne correctement.

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 18:03
par walkson
D'abord, utilisez des UDF actuels et fonctionnels
Exemple à tester:
 #include <Array.au3>
#include <File.au3>


$aArray = _FileListToArrayRec(@DesktopDir, "*.au3", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
    _ArrayDisplay($aArray, "Recur with filter")
   For $i = 1 To $aArray[0]
      ConsoleWrite($aArray[$i] & @CRLF)
      ;les opérations à faire sur les fichiers via $aArray[$i]
   Next
;==============================================================================================================
    Local $sAutoItDir = StringLeft(@AutoItExe, StringInStr(@AutoItExe, "\", Default, -1))
    If StringRight($sAutoItDir, 5) = "beta\" Then
        $sAutoItDir = StringTrimRight($sAutoItDir, 5)
    EndIf
    ShellExecute($sAutoItDir & "\AutoIt3Help.exe","_FileListToArrayRec")

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 18:08
par mikell
D'abord faites en sorte que _RecFileListToArray ne retourne QUE des fichiers (et pas des dossiers)
Ensuite le nombre de fichiers doit - en principe - être dans $ar_Array[0]
Donc vous bouclez comme ça :

For $i = 1 to $ar_Array[0]
...
traitement du fichier dont le nom/chemin est écrit dans l'élément $ar_Array[$i]
...
Next

Edit
Oups grillé par walkson :mrgreen:

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 18:24
par Boulanza
For $i = 1 to $ar_Array[0]
For $i = 1 to ^ ERROR

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 18:47
par Boulanza
Bonjour,
Je ne voie pas mon erreur ? le confinement + le ramadan baaaaaaaaa
#include <Array.au3>
#include <File.au3>
#include <MsgBoxConstants.au3>
Local $sAutoItDir=@TempDir & "\test\"
Local $aArray[1]
Local $aArray = _FileListToArrayRec($sAutoItDir, "*", $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_SORT)
For $i = 1 To $aArray[$i]
_ArrayAdd($aArray, $i)
Next

For $i = 0 To UBound($aArray)-1
    ConsoleWrite($aArray[$i] & @CRLF)
$hFileOpen = FileOpen($aArray[$i], $FO_OVERWRITE + $FO_BINARY)
FileWrite($aArray[$i], '0x123456789987654321')
Next

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 19:11
par Boulanza
C'est là où je coince. Blocage total...
For $i = 0 To UBound($aArray)-1
ConsoleWrite($aArray[$i] & @CRLF)
$hFileOpen = FileOpen($aArray[$i], $FO_OVERWRITE + $FO_BINARY)
FileWrite($aArray[$i], '0x123456789987654321')
Next

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 19:16
par franco
Salut.

je vais surement poster une ânerie mais....
mikell a écrit : dim. 03 mai 2020 18:08 D'abord faites en sorte que _RecFileListToArray ne retourne QUE des fichiers (et pas des dossiers)
Et tu utilises : $FLTAR_FILESFOLDERS : c'est normal ?


EDIT : normal que tu n'y arrives pas.

Regarde $FLTAR_FULLPATH dans l'aide de _FileListToArrayRec

++

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 19:28
par walkson
Bonjour Franco
S'il n'y avait que cela, ce ne serait pas grave !
$aArray = _FileListToArrayRec(@DesktopDir, "*.au3", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
Avec ce code, je lui ai servi un plat à domicile :P
Mais il a préféré ceci
Local $aArray = _FileListToArrayRec($sAutoItDir, "*", $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_SORT)
For $i = 1 To $aArray[$i]
_ArrayAdd($aArray, $i)
Next
S'il s'était donné la peine de lire l'aide, il aurait vu pour _FileListToArrayRe:
Succès:    Retourne un tableau de dimension 1 constitué comme il suit:
    [0] = Nombre de Fichiers/Répertoires retournés
    [1] = 1er Fichier/Répertoire
    [2] = 2e Fichier/Répertoire
et donc son code est un non sens !

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 19:39
par franco
Ahhhhh.... j'avais pô vu


C'est parce que :
$Resultat =_ArrayDisplay($ar_Array, "Liste fichier") ; Ceci est facultatif, c'est juste pour afficher la liste des fichiers.

Mais bon, il peut lister tous les fichiers dans une seule et même variable et la mettre dans le presse-papier (ou console write), au lieu de compliquer le script. ;)

J'avoue :mrgreen:


Par contre, je me demande quelque chose :
----> S'il veut remplacer une chaine de caractère... S'il la connait d'avance... Y'a beaucoup plus simple. :P

Re: [..] Remplacer une chaîne de caractères de plusieurs fichiers

Posté : dim. 03 mai 2020 20:57
par Boulanza
Vous êtes complètement loin de ma demande initiale: Remplacer une chaîne de caractères dans plusieurs fichiers.

Re: [..] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 21:07
par mikell
Certes. Mais pour faire ça il faut d'abord pouvoir accéder correctement aux fichiers en question

Re: [..] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 21:16
par Boulanza
Là je suis dans mon fichier et parfaitement :
 #include <Array.au3>
#include <File.au3>
Local $sAutoItDir=@TempDir & "\test\"
Local $aArray = _FileListToArrayRec($sAutoItDir, "*", $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_SORT)
_ArrayDisplay($aArray, "Arbre trié")
Mon problème est de placer:
$hFileOpen = FileOpen($aArray[$i], $FO_OVERWRITE + $FO_BINARY)
FileWrite($aArray[$i], '0x123456789987654321')

Re: [..] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 21:44
par mikell
TOUTES les réponses dont vous avez besoin sont écrites et mentionnées dans les posts précédents
Construisez votre boucle For , et visualisez $aArray[$i] avec une Msgbox ou autre pour vérifier qu'il y a bien le chemin du fichier

Re: [..] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 22:41
par Boulanza
Bonsoir,
Problème résolus après Iftar: repas de rupture du jeûne qui est pris le soir au coucher du soleil (en pus du confinement sous une chaleur de 40°).
La solution été évidente de puis la première réponse mais que faire... Je compte sur votre compréhension et je vous remercie de votre soutien et de votre coopération...
Cordialement.
#include <Array.au3>
#include <File.au3>

Local $sAutoItDir=@TempDir & "\testD\"
$aArray = _FileListToArrayRec($sAutoItDir, "*", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
    ;_ArrayDisplay($aArray, "Recur with filter")
If  _ArrayDisplay($aArray) = 1 Then
        For $i = 1 To $aArray[0]
               ; MsgBox(64, "test", $aArray[$i])
            ;ConsoleWrite($aArray[$i] & @CRLF)
$hFileOpen = FileOpen($aArray[$i], $FO_OVERWRITE + $FO_BINARY)
FileWrite($aArray[$i], '0x123456789987654321')
                ;les opérations à faire sur les fichiers via $aArray[$i]
        Next
EndIf

Re: [..] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 22:44
par Boulanza
Si on peut optimiser cela ce serait parfait ?

Re: [..] Remplacer une chaîne de caractères dans plusieurs fichiers

Posté : dim. 03 mai 2020 22:57
par franco
Salut.
Vous êtes complètement loin de ma demande initiale: Remplacer une chaîne de caractères dans plusieurs fichiers.
Pas du tout.

Je me cite ( ^^ )
Par contre, je me demande quelque chose :
----> S'il veut remplacer une chaine de caractère... S'il la connait d'avance... Y'a beaucoup plus simple. :P
Donc, question : la chaine à remplacer, c'est la même partout ?


Si oui, y'aura de l'optimisation.... ^^


++