Tuto vb.net : supprimer une ligne dans un fichier

Contenu du snippet

Cette fonction permet de supprimer une ligne dans un fichier texte, en fonction du numéro de la ligne ou du texte de la ligne.
La fonction permet de supprimer plusieurs lignes si on en spécifie plusieurs dans le cas où l'on précise les numéros des lignes ou alors au choix de supprimer soit toutes les occurences de la ligne soit lla premiere occurence seulement.
On peut choisir d'avoir exactement la ligne ou de supprimer les lignes qui contiennent tel texte.
On peut aussi choisir de respecter la casse ou pas.
Enfin on peut choisir de ne pas supprimer le fichier mais d'en créer un autre.
Voilà, j'espere avoir couvert les cas les plus courants.

Source / Exemple :


'********************
    'Principe de la fonction :
    'Si le paramètre DelLinesNumbers est vrai alors 
    '   on extrait dans Line les numéros des lignes à supprimer
    '   et on les supprime
    'sinon
    '   si le param JustOneEvent est vrai alors
    '       on cherche la première occurence de Line dans le fichier, on la supprime et on s'arrete
    '   sinon
    '       on cherche toutes les occurences de Line dans le fichier et on les supprime toutes
    '
    'Si testalltheline est vrai, il faut que la ligne du fichier lue soit exactement
    'pareille à la line passée en paramètre, sinon une simple occurence suffit
    '
    'Si Ucase est vrai alors on met Line et la ligne lue en majuscule lors de la comparaison 
    '(ex. : PomPomPom =! pompompom mais POMPOMPOM = POMPOMPOM )
    '
    '
    'Si NewFile est différent de "" alors on crée un nouveau fichier qui ne sera pas supprimé
    'a la fin de la fonction, et on ne modifie pas l'original
    '
    'Si la fonction échoue, elle renvoie Faux
    '
    'Pour supprimer une ligne dans un fichier texte
    'on copie toutes les autres lignes dans un fichier temporaire.
    '*********************
    '
    '
    'Le param Line doit contenir soit le texte de la ligne a supprimer, soit les numéros
    'des ligens a supprimer séparés par ;  ex. "3;7;15;150"
    '

    'On déclare la fonction.
    Public Function DelLineInFile(ByVal FilePath As String, _
                                    ByVal Line As String, _
                                    ByVal DelLinesNumbers As Boolean, _
                                    Optional ByVal JustOneEvent As Boolean = False, _
                                    Optional ByVal TestAllTheLine As Boolean = False, _
                                    Optional ByVal UCase As Boolean = False, _
                                    Optional ByVal NewFile As String = vbNullString) _
                                    As Boolean

        'On Error GoTo err

        Dim fSource As Integer 'Référence au fichier source
        Dim fTarget As Integer 'Référence au fichier cible
        Dim TempFile As String 'Variable qui contient le chemin du fichier temporaire
        Dim LineToCopy As String 'La ligne à copier dans le fichier

        'On obtient de FreeFile une référence de fichier libre
        'pour le fichier source 
        fSource = FreeFile()

        'On ouvre le fichier source en mode lecture et en acces partagé
        FileOpen(fSource, FilePath, OpenMode.Input, OpenAccess.Read, OpenShare.Shared)

        'On obtient de FreeFile une référence de fichier libre 
        'pour le fichier cible
        fTarget = FreeFile()

        'si le fichier destination est defini alors on le prend, sinon 
        'on demande a windows de créer un fichier temporaire
        TempFile = NewFile
        If TempFile = vbNullString Then TempFile = IO.Path.GetTempFileName()

        'On ouvre le fichier cible en mode ecriture et en acces partagé
        FileOpen(fTarget, TempFile, OpenMode.Output, OpenAccess.Write, OpenShare.Shared)

        'Si l'utilisateur souhaite que l'on supprime certaines lignes en fonction de 
        'leur numéro
        If DelLinesNumbers Then

            'on déclare le tableau qui contiendra l'analyse de Line
            'pour savoir qu'elles sont les lignes à supprimer
            Dim Lines() As String

            'on déclare le tableau qui contiendra les ligne en elles mêmes
            Dim LinesInt() As Integer
            Dim i As Integer ' variable pour les boucles For
            Dim CurrentLine ' variable pour savoir le nombre de lignes lues dans le fichier
            Dim CurrentLineIndex As Integer 'l'index dans LinesInt() de la ligne à supprimer 

            'la fonction slip separe les éléments de Line pour en extraire les lignes
            'et les mettres dans un tableau
            Lines = Line.Split(";")

            'ensuite on met les lignes :
            'on dimensionne le tableau d'entier
            ReDim LinesInt(Lines.GetUpperBound(0))

            'On transforme le tableau de lignes sous forme de chaines 
            'en tabeau sous forme d'entiers
            For i = Lines.GetLowerBound(0) To Lines.GetUpperBound(0)
                LinesInt(i) = Int(Lines(i))
            Next i

            'On tri le tableau par ordre croissant
            LinesInt.Sort(LinesInt)

            'la premiere ligne du tableau
            CurrentLineIndex = LinesInt.GetLowerBound(0)

            'si un utilisateur s'est trompé dans l'appel de la fonction
            'est a envoyé "5;4;f;7;u" f et u sont devenus 0 lors de la conversion, 
            'et la 0 eme ligne du fichier
            'n'existe pas, donc on les ignore
            'de plus puisque le tableau est trié tous les 0 sont au début
            Do Until (LinesInt(CurrentLineIndex) > 0) Or (CurrentLineIndex = Lines.GetUpperBound(0))
                CurrentLineIndex = CurrentLineIndex + 1
            Loop

            'Si aucune ligne > 0 n'a été trouvée, alors il n'ya aucune ligne a enlevé dans le fichier
            If (CurrentLineIndex = Lines.GetUpperBound(0)) And (LinesInt(CurrentLineIndex) = 0) Then GoTo err

            Do
                'on laisse la main au systeme pour pas tout bloquer
                'on lit une ligne
                LineToCopy = LineInput(fSource)
                'on incrémente le nombre de lignes de lues
                CurrentLine = CurrentLine + 1
                '
                'si la ligne lue est une ligne a supprimé on ne la copie pas 
                'et on passe a la ligne à supprimer suivante SI celle ci
                'n'est pas la derniere
                If CurrentLine = LinesInt(CurrentLineIndex) Then
                    If Not CurrentLineIndex = LinesInt.GetUpperBound(0) Then _
                        CurrentLineIndex = CurrentLineIndex + 1
                Else
                    'sinon on copie la ligne
                    Print(fTarget, LineToCopy & vbCrLf)
                End If

                'on continu jusqu'à ce qu'on arrive a la fin du fichier
            Loop While Not EOF(fSource)

        Else 'sinon on supprime les lignes semblables a Line

            'SI lutilisateur l'a spécifié, on teste tout en majuscule
            If UCase Then Line = Line.ToUpper

            Do
                LineToCopy = LineInput(fSource)
                'si l'utilisateur a spécifié que la même ligne lue
                'doit etre sensiblement exacte
                If TestAllTheLine Then
                    'Dans le cas où l'utilisateut demande une comparaison sans 
                    'respecter la casse
                    If UCase Then
                        'si la ligne lue n'est pas semblable a Line
                        'on la copie
                        If Not LineToCopy.ToUpper = Line Then _
                        Print(fTarget, LineToCopy & vbCrLf)
                        'Si on respecte la casse
                    Else
                        If Not LineToCopy = Line Then _
                        Print(fTarget, LineToCopy & vbCrLf)
                    End If
                Else
                    If UCase Then
                        'si aucune occurence de Line n'est trouvée dans la ligne lue alors
                        'on copie la ligne
                        If InStr(LineToCopy.ToUpper, Line) = 0 Then _
                            Print(fTarget, LineToCopy & vbCrLf)
                    Else
                        If InStr(LineToCopy, Line) = 0 Then _
                        Print(fTarget, LineToCopy & vbCrLf)
                    End If
                End If
            Loop While Not EOF(fSource)

        End If

        'on ferme l'acces aux fichiers
        FileClose(fSource, fTarget)

        's'il l'utilisateur n'a pas spécifié de nom de fichier cible alors 
        'on supprime l'ancien fichier et on copie le fichier temporaire a sa place
        If NewFile = vbNullString Then
            'on supprime l'ancien fichier
            Kill(FilePath)
            'on copie le fichier temporaire a sa place
            FileCopy(TempFile, FilePath)
        End If
        'sinon on conserve l'ancien fichier

        DelLineInFile = True 'la fonction a réussi
        Exit Function
err:

        DelLineInFile = False 'la fonction a échouée

    End Function

Conclusion :


Je n'ai pas eu le temps de bien la tester, faites moi part de vos observations et des bugs que vous rencontrez.

Cette source a un but d'apprentissage des accès fichier texte en .net

A la moindre hésitation ou incompréhension sur ce code n'hésitez à me contacter en laissant un commentaire ou un message ou sur #programmation

Voila Bonne Prog a tous.

PS : Notez la version vb6 publiée par Jack :
http://www.vbfrance.com/code.aspx?ID=22826

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.