#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 #include-once ; #FONCTION# ============================================================================== ; Nom ...........: _FileDeleteLines ; Description ...: Supprime une ou plusieurs lignes dans un fichier spécifié. ; Syntaxe .......: _FileDeleteLines($sFilePath, $iDelLines) ; Paramètres ....: $sFilePath - Chemin et nom du fichier à modifier ; $iDelLines - Numéro de ligne à supprimer (peut être un tableau croissant base-0 ) ; Valeurs Retour : Succès - Retourne 1. ; Echec - Retourne 0 et fixe l'erreur ; @Error - 1 = Problème de fichier ; @Error - 2 = Si $iDelLines n'est pas un nombre ou un tableau. ; Auteur ........: Tlem ; Modifié .......: ; Remarques .....: Cette fonction n'est probablement pas optimisée pour des petits fichiers, ; mais elle fonctionne sur des fichiers de grosse taille. ; Apparenté .....: ; Lien ..........: ; Exemple .......: ; ========================================================================================= Func _FileDeleteLines($sFilePath, $iDelLines = 0) ; Test si $iDelLines est un tableau ou un nombre. If Not IsNumber($iDelLines) And Not IsArray($iDelLines) Then Return SetError(2, 0, 0) EndIf ; Ouverture du fichier source Local $hFilePath = FileOpen($sFilePath,0) If $hFilePath = -1 Then Return SetError(1, 0, 0) ; Déclaration des variables utilisées dans la fonction Local $sTmpFile = @TempDir & "\tmpfile.txt" Local $ArrayIndex = 0 Local $sLineTxt = "" Local $iLine = 0 Local $i ; Ouverture du fichier temporaire Local $hFiletmp = FileOpen($sTmpFile, 2) If $hFiletmp = -1 Then Return SetError(1, 0, 0) ; Cas ou $iDelLines est un nombre If IsNumber($iDelLines) Then ; Boucle d'écriture des lignes While 1 $iLine += 1 $sLineTxt = FileReadLine($hFilePath) If @error = -1 Then ExitLoop ; Sauf la ligne $iDelLines If $iLine <> $iDelLines Then FileWriteLine($hFiletmp, $sLineTxt) WEnd EndIf ; Cas ou $iDelLines est un tableau If IsArray($iDelLines) Then ; Vérifie si $iDelLines est un tableau croissant If Not IsNumber($iDelLines[0]) Then SetError(2, 0, 0) For $i = 1 to UBound($iDelLines) -1 If Not IsNumber($iDelLines[$i]) And $iDelLines[$i] < $iDelLines[$i - 1] Then SetError(2, 0, 0) EndIf Next ; Boucle d'écriture des lignes While 1 $iLine += 1 $sLineTxt = FileReadLine($hFilePath) If @error = -1 Then ExitLoop ; Sauf des lignes contenues dans le tableau $iDelLines If $iLine <> $iDelLines[$ArrayIndex] Then FileWriteLine($hFiletmp, $sLineTxt) Else $ArrayIndex += 1 EndIf WEnd EndIf ;Fermeture des fichiers FileClose($hFilePath) FileClose($hFiletmp) ; Si le fichier temporaire existe (> Oko) alors on le copie à la place du fichier d'origine. If FileExists($sTmpFile) And FileGetSize($sTmpFile) > 0 Then If Not FileMove($sTmpFile, $sFilePath, 1) Then Return SetError(1, 0, 0) EndIf EndIf Return 1 EndFunc ;==>_FileDeleteLines ; #FONCTION# ============================================================================== ; Nom ...........: _FileDeleteFirstLines ; Description ...: Supprime les premières lignes du fichier spécifié. ; Syntaxe .......: _FileDeleteFirstLines($sFilePath, $iDelLines) ; Parametres ....: $sFilePath - Chemin et nom du fichier à modifier ; $iDelLines - Nombre de lignes à supprimer ; Valeurs Retour : Succès - Retourne 1. ; Echec - Retourne 0 est fixe l'erreur ; Auteur ........: Tlem ; Modifié .......: ; Remarques .....: Cette fonction n'est probablement pas optimisée pour des petits fichiers, ; mais elle fonctionne sur des fichiers de grosse taille. ; Apparenté .....: ; Lien ..........: ; Exemple .......: ; ========================================================================================= Func _FileDeleteFirstLines($sFilePath, $iDelLines = 0) ; Ouverture du fichier source Local $hFilePath = FileOpen($sFilePath,0) If $hFilePath = -1 Then Return SetError(1, 0, 0) ; Déclaration des variables utilisées dans la fonction Local $sTmpFile = @TempDir & "\tmpfile.txt" Local $sLineTxt = "" Local $iLine = 0 ; Ouverture du fichier temporaire Local $hFiletmp = FileOpen($sTmpFile, 2) If $hFiletmp = -1 Then Return SetError(1, 0, 0) ; Boucle d'écriture des lignes While 1 $iLine += 1 $sLineTxt = FileReadLine($hFilePath) If @error = -1 Then ExitLoop If $iLine > $iDelLines Then FileWriteLine($hFiletmp, $sLineTxt) WEnd ;Fermeture des fichiers FileClose($hFilePath) FileClose($hFiletmp) ; Si le fichier temporaire existe (> Oko) alors on le copie à la place du fichier d'origine. If FileExists($sTmpFile) And FileGetSize($sTmpFile) > 0 Then If Not FileMove($sTmpFile, $sFilePath, 1) Then Return SetError(1, 0, 0) EndIf EndIf Return 1 EndFunc ;==>_FileDeleteFirstLines ; #FUNCTION# ============================================================================== ; Name...........: _FileDeleteLastLines ; Description ...: Supprime les dernières lignes du fichier spécifié. ; Syntaxe .......: _FileDeleteLastLines($sFilePath, $iDelLines) ; Parametres ....: $sFilePath - Chemin et nom du fichier à modifier ; $iDelLines - Nombre de lignes à supprimer ; Valeurs Retour : Succès - Retourne 1. ; Echec - Retourne 0 et fixe l'erreur ; Requis ......: _FileCountLines2 ; Auteur ........: Tlem ; Modifié .......: ; Remarques .....: Cette fonction n'est probablement pas optimisée pour des petits fichiers, ; mais elle fonctionne sur des fichiers de grosse taille. ; Apparenté .....: ; Lien ..........: ; Exemple .......: ; ========================================================================================= Func _FileDeleteLastLines($sFilePath, $iDelLines = 0) ; Ouverture du fichier source Local $hFilePath = FileOpen($sFilePath,0) If $hFilePath = -1 Then Return SetError(1, 0, 0) ; Déclaration des variables utilisées dans la fonction Local $sTmpFile = @TempDir & "\tmpfile.txt" Local $sLineTxt = "" ; Ouverture du fichier temporaire Local $hFiletmp = FileOpen($sTmpFile, 2) If $hFiletmp = -1 Then Return SetError(1, 0, 0) ; Comptage du nombre de ligne du fichier Local $iFileline = _FileCountLines2($sFilePath) - $iDelLines Local $iLine = 1 ; Boucle d'écriture des lignes While $iLine <= $iFileline $sLineTxt = FileReadLine($hFilePath) If @error = -1 Then ExitLoop FileWriteLine($hFiletmp, $sLineTxt) $iLine += 1 WEnd ;Fermeture des fichiers FileClose($hFilePath) FileClose($hFiletmp) ; Si le fichier temporaire existe (> Oko) alors on le copie à la place du fichier d'origine. If FileExists($sTmpFile) And FileGetSize($sTmpFile) > 0 Then If Not FileMove($sTmpFile, $sFilePath, 1) Then Return SetError(1, 0, 0) EndIf EndIf Return 1 EndFunc ;==>_FileDeleteLastLines ; #FUNCTION# ============================================================================== ; Nom ...........: _FileCountLines2 ; Description ...: Retourne le nombre de lignes dans le fichier spécifié. ; Syntaxe .......: _FileCountLines2($sFilePath) ; Paramètres ....: $sFilePath - Chemin et nom du fichier à lire ; Valeurs Retour : Succès - Retourne le nombre de lignes dans le fichier. ; Echec - Retourne 0 et fixe l'erreur ; @Error - 0 = Pas d'erreur. ; |1 = Le fichier ne peut être ouvert ou trouvé. ; Auteur ........: Tlem ; Modifié .......: ; Remarques .....: Cette fonction est sera légèrement plus lente que la fonction d'origine, si le fichier ; dépasse 179 639 503 octets sinon elle sera nettement plus rapide. ; Ne retourne pas d'erreur d'allocation mémoire même si le fichier est > 180Mo. ; Apparenté .....: ; Lien ..........: ; Exemple .......: ; ========================================================================================= Func _FileCountLines2($sFilePath) ; Ouverture du fichier Local $hFile = FileOpen($sFilePath, 0) If $hFile = -1 Then Return SetError(1, 0, 0) ; Récupération de la taille du fichier - 1 Local $N = FileGetSize($sFilePath) - 1 If @error Or $N = -1 Then Return SetError(1, 0, 0) ; La taille de lecture d'un fichier par un FileRead ne doit pas dépasser 183 145 242 octets, ; sinon, il y à une erreur d'allocation mémoire. ; Après plusieurs test, 179 639 503 octets semble être la taille maximale dans certains cas particuliers. If $N + 1 <= 179639503 Then ; Calcul du nombre de lignes. Local $nbLines = StringLen(StringAddCR(FileRead($hFile, $N))) - $N + 1 ; Fermeture du fichier FileClose($hFile) Return $nbLines EndIf Local $nbLine = 0 ; Boucle de lecture du fichier While 1 FileReadLine($hFile) If @error = -1 Then ExitLoop $nbLine += 1 WEnd ; Fermeture du fichier FileClose($hFile) Return $nbLine EndFunc ;==>_FileCountLines2