IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Erreur de conversion qui ne devrait pas être [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Erreur de conversion qui ne devrait pas être
    Bonjour,

    A l'aide d'exemple sur le net, j'ai créé une fonction pour faire du hashage MD5 d'un fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Function CreerMD5Fichier() As String
     
            Dim st As FileStream = Nothing
            Dim stbSommeControle As New StringBuilder()
     
            Try
                Dim check As New MD5CryptoServiceProvider
                st = System.IO.File.Open(Me.NomComplet, FileMode.Open, FileAccess.Read)
                Dim somme As Byte() = check.ComputeHash(st)
     
                For Each a As Byte In somme
                    stbSommeControle.Append(a.ToString("X2"))
                Next
     
            Catch Ex As Exception
                Throw
            Finally
                If st IsNot Nothing Then st.Close()
            End Try
     
            Return stbSommeControle.ToString
     
        End Function
    Cette fonction est dans une classe et sert à alimenter une propriété de la classe définie en String (si si j'ai vérifié tellement )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Try
            Me.SommeControle = CreerMD5Fichier("nom_fichier")
    Catch Ex As Exception ' passe tout le temps ici
            Me.SommeControle = String.Empty
    End Try
    La fonction marche bien mais au niveau de l'affectation ci-dessus, j'ai le message d'erreur :
    La conversion de la chaîne "nom_fichier" en type 'Integer' n'est pas valide.
    Avec le debugger j'ai vu que le code passe tout le temps dans l'exception ci-dessus.
    Je ne comprends pas où est l'integer en question ?
    Je suis perdu et je vais devenir fou
    Merci de m'aider.

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Pourquoi utiliser la propriété d'une classe pour simplement calculer un hachage MD5, autant utiliser une simple fonction shared :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Public Shared Function CreerMD5Fichier(FilePath$) As String
     
            Dim st As FileStream = Nothing
            Dim stbSommeControle As New StringBuilder()
     
            Try
                Dim check As New MD5CryptoServiceProvider
                st = System.IO.File.Open(FilePath, FileMode.Open, FileAccess.Read)
                Dim somme As Byte() = check.ComputeHash(st)
     
                For Each a As Byte In somme
                    stbSommeControle.Append(a.ToString("X2"))
                Next
     
            Catch Ex As Exception
                Throw
            Finally
                If st IsNot Nothing Then st.Close()
            End Try
     
            Return stbSommeControle.ToString
     
        End Function
    Car du coups :
    - On ne sait pas si la classe dont tu parles possède un initialiseur du fait que tu n'initialises pas d'instance de cette fameuse classe d'ou provient la fonction o___O
    - On ne sait pas à quel moment tu as passés le chemin du fichier à ta variabe : Me.NomComplet
    ....etc.....

    En fait ce qu'il aurait été judicieux de voir apparaître lorsque tu évoques ton soucis c'est cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim FilePath$ = "C:\tttt.txt"
    Dim md5 as new Cls_Hash(FilePath)
    Dim result$ = md5.CreerMD5fichier()


    A+

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Heu....
    @wallace1, il a tout encapsuler, c'est lui qui gère le chemin etc... et il a pas de problème la dessus.
    La propriété, permet d'accéder au résultat... Ça m'a l'air d'être correct en développement en classe. Je vois pas le souci en fait.

    Et ton souci, Hobbi1, c'est que ta fonction retourne un String et je pari ma chemise que SommeControle est un Integer.

    Donc ta fonction, fais lui retourner un Integer, et ne retourne que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return stbSommeControle
    pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return stbSommeControle.ToString
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Donc voici un peu plus de détail sur mon code.

    C'est dans une Form que la classe est instanciée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MonFichier As New clsFichier
    Puis un peu plus loin dans la même Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' On renseigne le ficher
    MonFichier.NomComplet = txtFichier.Text
     
    ' On recherche les informations à l'aide d'une fonction de la classe
    MonFichier.LireInformationsSysteme()
    La fonction LireInformationsSysteme de la classe clsFichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Public Sub LireInformationsSysteme()
     
            Dim MesInfosFichier As New FileInfo(Me.NomComplet)
     
            Me.Nom = MesInfosFichier.Name
            Me.Extension = MesInfosFichier.Extension.Replace(".", String.Empty)
            Me.Taille = MesInfosFichier.Length
            Me.DateCreation = MesInfosFichier.CreationTime.ToString
            Me.DateModification = MesInfosFichier.LastWriteTime.ToString
     
            Try
                   Me.SommeControle = CreerMD5Fichier(Me.NomComplet)
            Catch Ex As Exception
                   Me.SommeControle = String.Empty
            End Try
     
            Me.Repertoire = MesInfosFichier.DirectoryName
     
            Dim MesInfosRepertoire As New DirectoryInfo(MesInfosFichier.DirectoryName)
            Me.CreationRepertoire = MesInfosRepertoire.CreationTime.ToString
            Me.ModificationRepertoire = MesInfosRepertoire.LastWriteTime.ToString
     
            MesInfosRepertoire = Nothing
            MesInfosFichier = Nothing
     
            Me.ExistenceInformations = True
     
        End Sub
    La fonction CreerMD5Fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Function CreerMD5Fichier() As String
     
            Dim st As FileStream = Nothing
            Dim stbSommeControle As New StringBuilder()
     
            Try
                Dim check As New MD5CryptoServiceProvider
                st = System.IO.File.Open(Me.NomComplet, FileMode.Open, FileAccess.Read)
                Dim somme As Byte() = check.ComputeHash(st)
     
                For Each a As Byte In somme
                    stbSommeControle.Append(a.ToString("X2"))
                Next
     
            Catch Ex As Exception
                Throw
            Finally
                If st IsNot Nothing Then st.Close()
            End Try
     
            Return stbSommeControle.ToString
     
        End Function
    La propriété SommeControle qui pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private _SommeControle As String
     
    Public Property SommeControle() As String
            Get
                Return _SommeControle
            End Get
            Set(ByVal strValeur As String)
                _SommeControle = strValeur
            End Set
    End Property
    J'espère que ça vous permettra de m'aider.
    Merci.

  5. #5
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Tu as d'un côté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Me.SommeControle = CreerMD5Fichier(Me.NomComplet)
    Et de l'autre, CreerMD5Fichier n'a pas de paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function CreerMD5Fichier() As String
    Erreur de copie ?
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  6. #6
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Hobbi,

    Tu passes la variable "nomcomplet" en tant qu'argument à ta méthode : CreerMD5Fichier alors que la fonction en question n'accepte pas d'argument de type string tout simplement !

    ----> Remplaces ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Try
                    Me.SommeControle = CreerMD5Fichier(Me.NomComplet)
                Catch Ex As Exception
                    Me.SommeControle = String.Empty
                End Try
    ----> par cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Try
                    Me.SommeControle = CreerMD5Fichier()
                Catch Ex As Exception
                    Me.SommeControle = String.Empty
                End Try
    Sous réserve que ta classe ressemble (en version très très simplifiée à cela : CF Nested) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Imports System.IO
    Imports System.Text
    Imports System.Security.Cryptography
     
    Public Class Form1
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim MonFichier As New clsFichier
            MonFichier.nomcomplet = "C:\output.txt"
            MonFichier.LireInformationsSysteme()
            MsgBox(MonFichier.SommeControle())
        End Sub
     
        'Nested
        Public Class clsFichier
            Property Nom As String
            Property extension As String
            Property Taille As String
            Property DateCreation As String
            Property DateModification As String
            Property Repertoire As String
            Property CreationRepertoire As String
            Property ModificationRepertoire As String
            Property ExistenceInformations As String
     
            Property NomComplet As String
            Property SommeControle As String
     
            Public Sub LireInformationsSysteme()
     
                Dim MesInfosFichier As New FileInfo(Me.NomComplet)
     
                Me.Nom = MesInfosFichier.Name
                Me.extension = MesInfosFichier.Extension.Replace(".", String.Empty)
                Me.Taille = MesInfosFichier.Length
                Me.DateCreation = MesInfosFichier.CreationTime.ToString
                Me.DateModification = MesInfosFichier.LastWriteTime.ToString
     
                Try
                    Me.SommeControle = CreerMD5Fichier()
                Catch Ex As Exception
                    Me.SommeControle = String.Empty
                End Try
     
                Me.Repertoire = MesInfosFichier.DirectoryName
     
                Dim MesInfosRepertoire As New DirectoryInfo(MesInfosFichier.DirectoryName)
                Me.CreationRepertoire = MesInfosRepertoire.CreationTime.ToString
                Me.ModificationRepertoire = MesInfosRepertoire.LastWriteTime.ToString
     
                MesInfosRepertoire = Nothing
                MesInfosFichier = Nothing
     
                Me.ExistenceInformations = True
     
            End Sub
     
            Private Function CreerMD5Fichier() As String
     
                Dim st As FileStream = Nothing
                Dim stbSommeControle As New StringBuilder()
     
                Try
                    Dim check As New MD5CryptoServiceProvider
                    st = System.IO.File.Open(Me.NomComplet, FileMode.Open, FileAccess.Read)
                    Dim somme As Byte() = check.ComputeHash(st)
     
                    For Each a As Byte In somme
                        stbSommeControle.Append(a.ToString("X2"))
                    Next
     
                Catch Ex As Exception
                    Throw
                Finally
                    If st IsNot Nothing Then st.Close()
                End Try
     
                Return stbSommeControle.ToString
     
            End Function
     
     
        End Class
    End Class
    PS : je dis très très simplifié car à mon sens :
    - il faudrait lever des exceptions dans les property : existence de fichier, ...etc.....
    - la méthode CreerMD5Fichier devrait être "Private"
    - l'initialiseur devrait comporter le chemin de fichier complet pour éviter d'accéder au préalable à des champs non affectées du fait que la Sub LireInformationsSysteme n'ai pas été appelée au moins une fois.....
    .....
    .......etc....

    EDIT : Grillé par mactwist69, ça m'apprendra à faire 10 choses en même tps...


    a+

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Non mactwist69 il ne s'agit pas d'une erreur de copie.
    Mais peut-être une erreur de codage

    Lors de mes tests, j'ai pris des fichiers qui existent
    Je ne savais pas qu'on pouvait logguer dans les properties

    Je vais mettre la méthode CreerMD5Fichier en "Private"

    Je ne comprends pas la dernière remarque.
    La propriété NomComplet est renseignée jsute après l'appel de la Sub LireInformationsSysteme

  8. #8
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Lol wallace, j'avoue j'étais au taquet ce matin.

    Et Hobbi1, ce que wallace a voulu dire c'est de mettre directement le nom du fichier dans le constructeur (initialisateur, c'est jolie comme mot mais je crois pas que se soit le bon).

    Et il a raison, si ton objet est identifié par son chemin, autant le passé au constructeur directement.
    Ca éviterai par exemple d’écrire du code en oubliant de renseigner le chemin.

    Ca donnerai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub New (Byval Chemin as String)
     
         If String.IsNullOrEmpty(Chemin)
                Throw New Exception("Erreur: le chemin est vide")
         End If
     
         If Not System.IO.File.Exists(Chemin)
                Throw New Exception("Erreur: le fichier n'existe pas")
        End If
     
        Me.Nom = Chemin
     
    End Sub
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci de ces précisions mactwist69

    Je ne peux tester de suite. Je vous fais un retour quand ca sera fait.

  10. #10
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Pas de souci, c'était juste pour la précision.

    Marque ne résolu si tu as eu ta réponses, ça aidera peut être d'autres !
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  11. #11
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Lol wallace, j'avoue j'étais au taquet ce matin.

    Et Hobbi1, ce que wallace a voulu dire c'est de mettre directement le nom du fichier dans le constructeur (initialisateur, c'est jolie comme mot mais je crois pas que se soit le bon).
    lol désolé je parle plus souvent de termes techniques en anglais...... d'ou "initializer" ....... ou procédure "initilialize" donc en franglais ça donne initialiseur.....

    Au risque de devoir être rabajoi.... c'est bien le terme approprié j'espère mactwist69 .... ^ ^ ...pour une meilleure lisibilité du code si une propriété est disponible dans une classe alors on place l'exception à l'intérieur et pas dans le constructeur..... c'est à ca que sert une property à pouvoir effectuer des routines dans le getter ou le setter !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
       Private _NomComplet
            Public Property NomComplet As String
                Get
                    Return _NomComplet
                End Get
                Set(ByVal value As String)
                    If String.IsNullOrEmpty(value) Then
                        Throw New Exception("Erreur: le chemin est vide")
                    End If
                    _NomComplet = value
                End Set
            End Property
     
            Sub New(FilePath As String)
                NomComplet = FilePath
            End Sub
    Et pour gérer une éventuelle exception n'oublies pas de placer ton code dans un bloc "Try...Catch" ...donc grossomodo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Try
                Dim MonFichier As New clsFichier("")
                MonFichier.LireInformationsSysteme()
                MsgBox(MonFichier.SommeControle())
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
    A+

  12. #12
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    lol désolé je parle plus souvent de termes techniques en anglais...... d'ou "initializer" ....... ou procédure "initilialize" donc en franglais ça donne initialiseur
    Heinnn ! C'est donc une digression linguistique ! lol
    J'avoue, moi même j'écris "Connection" de partout au lieu de "Connexion", mais ça sonne pareil.

    +1 Pour le reste !
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  13. #13
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Ca fonctionne maintenant. C'était bien le problème de l'argument NomComplet dans l'appel à la fonction (alors que non défini dans la signature).

    Et je vais en profiter pour ajouter les quelques modifs, comme la gestion des exception dans les propriétés.

    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/03/2015, 19h02
  2. [XL-2010] Variable qui ne devrait pas être vide
    Par GSFBC dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 20/05/2014, 14h00
  3. Titre des images qui ne devrait pas être affiché
    Par sedrilo dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 5
    Dernier message: 19/08/2007, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo