none
problème de suppression de fichier. RRS feed

  • Question

  • Bonjour.

    Je suis en trin de faire un petit logiciel pour m’entraîner à la manipulation de fichiers cryptés :

    décrypter lire encrypter supprimer.

    j'ai donc fait ce code qui marchait à merveille jusqu'à midi....

    Depuis je cherche d'où peut venir l'erreur mais je ne trouve pas....

    Voici mon code : 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            'Décrypte le fichier dans un fichier lisible "test.dll"
            DecryptFile("12.dll", _
                "test.dll", _
                sSecretKey)
    
            'Lis le fichier lisible
            lectureFichier("test.dll")
    
            'Recrypte le fichier test.dll en 12.dll
            EncryptFile("test.dll", _
        "12.dll", _
        sSecretKey)
    
            'Supprime le fichier lisible.
            My.Computer.FileSystem.DeleteFile("test.dll")
    
        End Sub

    Voila mon programme principal.

    Il me le lance et il me met une erreur au moment de supprimer le fichier lisible comme quoi mon fichier "test.dll" est encore utilisé.

    voici les fonctions encrypter et décrypter :

    Sub DecryptFile(ByVal sInputFilename As String, _
                        ByVal sOutputFilename As String, _
                        ByVal sKey As String)
    
            Dim DES As New DESCryptoServiceProvider()
            'Une clé de 64 bits et un vecteur d'initialisation sont requis pour ce fournisseur.
            'Définit la clé secrète pour l'algorithme DES.
            DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
            'Définit le vecteur d'initialisation.
            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    
            'crée un flux de fichier pour lire le fichier crypté de retour
            Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
            'crée un décrypteur DES à partir de l'instance DES
            Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
            'crée un flux de cryptage, défini pour lire et effectuer une transformation de décryptage DES sur les octets entrants
            Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
            'imprime le contenu du fichier décrypté
            Dim fsDecrypted As New StreamWriter(sOutputFilename)
            fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
            fsDecrypted.Flush()
            fsDecrypted.Close()
            fsread.Dispose()
        End Sub


    et encrypter :

      
      Sub EncryptFile(ByVal sInputFilename As String, _
                        ByVal sOutputFilename As String, _
                        ByVal sKey As String)
    
            Dim fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
            Dim fsEncrypted As New FileStream(sOutputFilename, _
                                        FileMode.Create, FileAccess.Write)
    
            Dim DES As New DESCryptoServiceProvider()
    
            'Définit la clé secrète pour l'algorithme DES.
            'Une clé de 64 bits et un vecteur d'initialisation sont requis pour ce fournisseur
            DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    
            'Définit le vecteur d'initialisation.
            DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    
            'crée un crypteur DES à partir de cette instance
            Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
            'Crée un flux de cryptage qui transforme le flux de fichier à l'aide du cryptage DES
            Dim cryptostream As New CryptoStream(fsEncrypted, _
                                                desencrypt, _
                                                CryptoStreamMode.Write)
    
            'Lit le texte du fichier dans le tableau d'octets
            Dim bytearrayinput(fsInput.Length - 1) As Byte
            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
            'écrit le fichier crypté à l'aide de DES
            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
            cryptostream.Close()
            fsInput.Dispose()
        End Sub

    Et ici ma fonction lecturefichier :

        Sub lectureFichier(ByVal fichier As String)
            Try
                ' Création d'une instance de StreamReader pour permettre la lecture de notre fichier
                Dim monStreamReader As StreamReader = New StreamReader(fichier)
    
                'Lecture de toutes les lignes et stop sur "Classe :"
                Do
                    ligne = monStreamReader.ReadLine()
                Loop While ligne <> "Classe :"
    
                'se déplace d'une ligne
                ligne = monStreamReader.ReadLine()
    
                'Lis la ligne et l'ajoute dans combobox jusqu'à la fin des classes.
                Do
                    ComboBox1.Items.Add(ligne)
                    ligne = monStreamReader.ReadLine()
                Loop While ligne <> ""
                'Fermeture du StreamReader (attention très important)
                monStreamReader.Close()
            Catch ex As Exception
            End Try
        End Sub

    Voila.

    Si vous voyez un problème merci par avance.



    • Modifié Vidou vendredi 28 novembre 2014 15:22
    vendredi 28 novembre 2014 14:19

Réponses

  • Bonsoir,

    Utilisez l'instruction Using systématiquement pour les classes IDisposable.

    Si vous avez besoin de faire un try catch (comme dans lectureFichier), ajoutez Finally et dans le bloc Finally, appelez Dispose().

    Ici, si il y a une erreur dans le code de LectureFichier, il continuera quand même mais le fichier sera toujours ouvert (vous avez sans doute une exception de levée dans cette partie du code).


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 16:15
  • Je vous ai mis un lien pour Using.

    Sinon, votre code devrait ressembler à cela :

        Sub EncryptFile(ByVal sInputFilename As String, _
                        ByVal sOutputFilename As String, _
                        ByVal sKey As String)
    
            Using fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
                Using fsEncrypted As New FileStream(sOutputFilename, _
                                            FileMode.Create, FileAccess.Write)
                    Using DES As New DESCryptoServiceProvider()
                        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
                        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
                        Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
                        Using cryptostream As New CryptoStream(fsEncrypted, _
                                                            desencrypt, _
                                                            CryptoStreamMode.Write)
                            Dim bytearrayinput(fsInput.Length - 1) As Byte
                            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
                            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
                        End Using
                    End Using
                End Using
            End Using
        End Sub
    
        Sub DecryptFile(ByVal sInputFilename As String, _
                        ByVal sOutputFilename As String, _
                        ByVal sKey As String)
            Using DES As New DESCryptoServiceProvider()
                DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
                DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
                Using fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
                    Using desdecrypt As ICryptoTransform = DES.CreateDecryptor()
                        Using cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
                            Using fsDecrypted As New StreamWriter(sOutputFilename)
                                Using reader = New StreamReader(cryptostreamDecr)
                                    fsDecrypted.Write(reader.ReadToEnd())
                                    fsDecrypted.Flush()
                                End Using
    
                            End Using
                        End Using
                    End Using
                End Using
            End Using
        End Sub
    
    
        Sub lectureFichier(ByVal fichier As String)
            Using monStreamReader As StreamReader = New StreamReader(fichier)
                Do
                    ligne = monStreamReader.ReadLine()
                Loop While ligne <> "Classe :"
                ligne = monStreamReader.ReadLine()
                Do
                    'ComboBox1.Items.Add(ligne)
                    ligne = monStreamReader.ReadLine()
                Loop While ligne <> ""
            End Using
        End Sub


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 16:49

Toutes les réponses

  • Bonsoir,

    Utilisez l'instruction Using systématiquement pour les classes IDisposable.

    Si vous avez besoin de faire un try catch (comme dans lectureFichier), ajoutez Finally et dans le bloc Finally, appelez Dispose().

    Ici, si il y a une erreur dans le code de LectureFichier, il continuera quand même mais le fichier sera toujours ouvert (vous avez sans doute une exception de levée dans cette partie du code).


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 16:15
  • Je ne comprends pas :/ comment utiliser Using ? et dispose me ferme le programme. j'ai loupé un épisode je crois !
    vendredi 28 novembre 2014 16:40
  • Je vous ai mis un lien pour Using.

    Sinon, votre code devrait ressembler à cela :

        Sub EncryptFile(ByVal sInputFilename As String, _
                        ByVal sOutputFilename As String, _
                        ByVal sKey As String)
    
            Using fsInput As New FileStream(sInputFilename, _
                                        FileMode.Open, FileAccess.Read)
                Using fsEncrypted As New FileStream(sOutputFilename, _
                                            FileMode.Create, FileAccess.Write)
                    Using DES As New DESCryptoServiceProvider()
                        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
                        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
                        Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
                        Using cryptostream As New CryptoStream(fsEncrypted, _
                                                            desencrypt, _
                                                            CryptoStreamMode.Write)
                            Dim bytearrayinput(fsInput.Length - 1) As Byte
                            fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
                            cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
                        End Using
                    End Using
                End Using
            End Using
        End Sub
    
        Sub DecryptFile(ByVal sInputFilename As String, _
                        ByVal sOutputFilename As String, _
                        ByVal sKey As String)
            Using DES As New DESCryptoServiceProvider()
                DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
                DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
                Using fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
                    Using desdecrypt As ICryptoTransform = DES.CreateDecryptor()
                        Using cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
                            Using fsDecrypted As New StreamWriter(sOutputFilename)
                                Using reader = New StreamReader(cryptostreamDecr)
                                    fsDecrypted.Write(reader.ReadToEnd())
                                    fsDecrypted.Flush()
                                End Using
    
                            End Using
                        End Using
                    End Using
                End Using
            End Using
        End Sub
    
    
        Sub lectureFichier(ByVal fichier As String)
            Using monStreamReader As StreamReader = New StreamReader(fichier)
                Do
                    ligne = monStreamReader.ReadLine()
                Loop While ligne <> "Classe :"
                ligne = monStreamReader.ReadLine()
                Do
                    'ComboBox1.Items.Add(ligne)
                    ligne = monStreamReader.ReadLine()
                Loop While ligne <> ""
            End Using
        End Sub


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 28 novembre 2014 16:49
  • ah oui dsl j'avais pas vu.

    En gros c'est pareil que ce que j'ai fait avec l’avantage de libérer toutes les ressources et tout ce qu'on à pu faire dans la fonction c'est bien ça ?   

    Mais du coup "dispose ()" je le met dans un bloc catch try ?

    par exemple

    Sub lectureFichier(ByVal fichier As String) Using monStreamReader As StreamReader = New StreamReader(fichier) try

    Do ligne = monStreamReader.ReadLine() Loop While ligne <> "Classe :" ligne = monStreamReader.ReadLine() Do 'ComboBox1.Items.Add(ligne) ligne = monStreamReader.ReadLine() Loop While ligne <> ""

    finally

    dispose ()

         End Try

    End Using End Sub

    c'est bien ça si j'ai bien compris ?



    • Modifié Vidou lundi 1 décembre 2014 14:25
    lundi 1 décembre 2014 12:48