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 :

Obtenir l'extension d'un fichier présent dans les ressources


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 55
    Points : 41
    Points
    41
    Par défaut Obtenir l'extension d'un fichier présent dans les ressources
    Bonsoir, toujours dans l'optique d'un lecteur de pistes audios (Je tiens d'ailleurs à remercier ShadowTzu pour son aide précieuse)
    J'ai besoin de lister tout les fichiers des ressources projet ayant pour extension "mp3"
    J'arrive à obtenir le nom des fichiers présents dans les ressources
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       For Each ResourceFileName In My.Resources.ResourceManager.GetResourceSet(System.Globalization.CultureInfo.CurrentCulture,True,True)
                MsgBox(ResourceFileName.Key)
            Next
    Seul problème, sa n'affiche que le nom du fichier. Hors il me faudrait également l'extension pour pouvoir "filtrer" ces fichiers mp3

    J'ai donc pensé à essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    path.getextension(ResourceFileName.Key.tostring)
    sans succès ...

    Je sollicite donc à nouveau votre aide pour m'endormir moins bête ce soir

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Je viens de faire de nouveaux test avec "extension" de FileInfo mais c'est pareil sa m'affiche " "
    Je n'ai plus d'idées sur comment procéder

  3. #3
    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
    Bonjour peltiarn,

    Je vais te mettre sur la voie en te posant les bonnes questions :

    Q : Dans la programmation comment détecte-ton qu'un fichier est de tel ou tel type sans pour autant avoir une quelconque extension (PNG, EXE, ...etc...) ?
    R : Grace au "MimeType" (http://fr.wikipedia.org/wiki/Type_MIME) ou la signature des fichiers (http://www.garykessler.net/library/file_sigs.html)

    Q : Lorsque tu accèdes à une ressource du type : , sous quelle type est-elle retournée ?
    R : De plusieurs types et majoritairement : Image, Bitmap, Icon, Byte()

    Nous allons pouvoir parcourir les ressources présentes dans la totalité de notre programme pour identifier la signature adequat :

    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
      'On récupère l'assembly qui est en cours d'exécution
                Dim MainAss As System.Reflection.Assembly
                MainAss = System.Reflection.Assembly.GetExecutingAssembly()
                'On récupère tous les noms de resources d'assembly. Attention ça ne corresponds pas aux noms des fichiers de resources !!
                Dim resources As String() = MainAss.GetManifestResourceNames()
     
                For Each res In resources
                    'If res.EndsWith("Resources.resources") Then
                    'On récupère le flux de chaque resource
                    Dim stream As Stream = MainAss.GetManifestResourceStream(res)
                    If Not stream Is Nothing Then
                        'On déclare un resourceReader de façon à pouvoir lire le flux
                        Dim resReader As IResourceReader = New ResourceReader(stream)
                        'On parcours le dictionnaire ou la clé (Key) corresponds au nom de la resource et la valeur (Value) à la donnée proprement dit
                        For Each re As DictionaryEntry In resReader
     
                            If TypeOf re.Value Is Icon Then
     
                            ElseIf TypeOf re.Value Is Image Then
     
                            ElseIf TypeOf re.Value Is Bitmap Then
     
                            ElseIf TypeOf re.Value Is ImageListStreamer Then
     
                            Else
                                Try
                                    Dim MP3 As Byte() = {255, 251, 48}
                                    Dim tmpFile$ = Path.GetTempFileName
                                    System.IO.File.WriteAllBytes(tmpFile, re.Value)
                                    If (System.IO.File.ReadAllBytes(tmpFile)).Take(2).SequenceEqual(MP3) Then
                                        MsgBox("Name : " & re.Key & vbNewLine & "Extension : MP3")
                                    End If
                                Catch ex As Exception
                                    MsgBox(ex.ToString)
                                End Try
                            End If
                        Next
                        resReader.Close
                    End If
                    'End If
                Next

    A+

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Merci pour ces explications, j'ai essayé ce que tu propose (j'ai du passer du framework 2.0 à 3.5) mais j'obtient l'erreur
    "Impossible d'effectuer un cast d'un objet de type 'System.String' en type 'System.Byte' "
    à la lligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.IO.File.WriteAllBytes(tmpFile, re.Value)
    Je suppose que cela signifie que "re.Value" n'est pas reconnu en tant que Byte ?!

    Sinon je pense avoir compris le reste du code mis à part une ou deux choses:
    - Pourquoi n'utilise t-on pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     'If res.EndsWith("Resources.resources") Then
    - Comment sais-tu que la signature d'un ficheir MP3 est "255, 251, 48"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MP3 As Byte() = {255, 251, 48}
    Je n'ai pas trouver cette valeur dans le tableau sur http://www.garykessler.net/library/file_sigs.html
    - Pourquoi doit-on créer un fichier temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Dim tmpFile$ = Path.GetTempFileName
                System.IO.File.WriteAllBytes(tmpFile, re.Value)
    N'est ce pas possible de directement lire le contenu de la valeur du dictonnaire "re" ?

    Désolé pour toutes ces questions

  5. #5
    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 peltiarn Voir le message
    Merci pour ces explications, j'ai essayé ce que tu propose (j'ai du passer du framework 2.0 à 3.5) mais j'obtient l'erreur
    "Impossible d'effectuer un cast d'un objet de type 'System.String' en type 'System.Byte' "
    à la lligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.IO.File.WriteAllBytes(tmpFile, re.Value)
    Je suppose que cela signifie que "re.Value" n'est pas reconnu en tant que Byte ?!
    Je n'allais pas ajouter tous les types possibles dans mon snippet donc au vue de l'erreur tu as au minimum 1 fichier de type "String" (ou .txt") dans tes ressources ! A toi d'ajouter la conditionnelle dans le snippet.


    Citation Envoyé par peltiarn Voir le message
    Sinon je pense avoir compris le reste du code mis à part une ou deux choses:
    - Pourquoi n'utilise t-on pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     'If res.EndsWith("Resources.resources") Then
    Cela corresponds au nom de l'assembly de resources principale du projet. En somme les ressources de ton formulaire de démarrage de ton appli.
    Je l'ai utilisé dans mon projet actuel mais ne voulant pas parcourir le reste des fichiers ressources de mon projet j'ai placé cette conditionnelle.


    Citation Envoyé par peltiarn Voir le message
    - Comment sais-tu que la signature d'un ficheir MP3 est "255, 251, 48"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MP3 As Byte() = {255, 251, 48}
    Je n'ai pas trouver cette valeur dans le tableau sur http://www.garykessler.net/library/file_sigs.html
    C'est marqué dans la doc au contraire ! ID3 corresponds à la signature numérique. Un éditeur hexa et un convertisseur permet de calculer rapidement tout ça !

    Citation Envoyé par peltiarn Voir le message
    - Pourquoi doit-on créer un fichier temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Dim tmpFile$ = Path.GetTempFileName
                System.IO.File.WriteAllBytes(tmpFile, re.Value)
    N'est ce pas possible de directement lire le contenu de la valeur du dictonnaire "re" ?
    Parce que c'est un exemple et comme dans tout exemple, l'optimisation c'est à toi de la prévoir


    A+

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Merci pour ces explications,j'y vois plus claire à présent
    J'ai donc rajouter la condition pour les fichiers texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ElseIf TypeOf re.Value Is String Then
    J'ai ensuite lancer un test mais aucun fichier MP3 n'a été "détecté" (Au moins il n'y a pas de message d'erreur )
    J'ai alors fait un autre essais en modifiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      If (System.IO.File.ReadAllBytes(tmpFile)).Take(2).SequenceEqual(MP3) Then
                                    MsgBox("Name : " & re.Key & vbNewLine & "Extension : MP3")
                                End If
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      If (System.IO.File.ReadAllBytes(tmpFile)).Take(2).SequenceEqual(MP3.Take(2)) Then
                                    MsgBox("Name : " & re.Key & vbNewLine & "Extension : MP3")
                                End If
    Ce qui ma permis de "détecter" deux fichiers MP3, seulement voila, il y en a plus de deux.
    J'ai regarder ceci http://msdn.microsoft.com/en-us/libr...=vs.90%29.aspx pour essayer de voir si mon erreur vient de l'utilisation de ".Take(x)" mais je ny comprends pas grand chose.

  7. #7
    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
    Bon très bien j'ai compris ....je vais t'expliquer comment obtenir la valeur du positionnement des bytes :

    1 fichier MP3 est constitué de plusieurs frames mais celui qui nous intéresse est le tout premier au début du fichier :

    http://imabox.fr/a3/1409051702LgkpVj59.png

    Comme tu peux le voir j'ai 3 fichiers MP3 et tous 3 n'ont pas la même valeur aux 2 premières positions, ce qui nous donne respectivement :

    - FF FB conversion en bytes = 255 251
    - FF FA conversion en bytes =255 250
    - 49 44 conversion en bytes = 73 68

    PS : le plus utilisé de nos jours : - 49 44 33 conversion en bytes = 73 68 51 (ce qui corresponds à la chaine ID3)

    Est-il nécessaire que je t'explique comment constituer le tableau de bytes ?? nan je pense pas...^^

    Cependant puisque maintenant on est dans le vif du sujet il est préférable de lire le fichier grace à la classe binaryReader. Voici un petit exemple (NON optimisé !):

    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
     
      Dim BinaryFile As New FileStream("YOUR_FILEPATH.MP3", FileMode.Open, FileAccess.Read)
                    Dim Reader As New BinaryReader(BinaryFile)
     
                    Dim Posit1 As Byte
                    Dim posit2 As Byte
     
                    BinaryFile.Seek(0, SeekOrigin.Begin)
                    Posit1 = Reader.ReadByte
                    BinaryFile.Seek(1, SeekOrigin.Begin)
                    posit2 = Reader.ReadByte
     
                    Reader.Dispose()
                    BinaryFile.Close()
     
                    MsgBox("Position 1 : " & Posit1 & vbNewLine & "Position 2 : " & posit2)
    Ce qu'il faut que tu retiennent c'est que suivant l'encodage du fichier le frame peut varier donc il faut que tu fasses un tour dans tes fichiers pour identifier si effectivement la signature est contenue dans la liste que je viens de te donner ...et le cas échéant l'agrandir.

    Pour ce qui est de la méthode ".Take(2)" sur la lecture des bytes d'un fichier, considère tout simplement qu'il lit les 2 premières positions du fichier. That's all !


    --> Ce que tu peux utiliser comme outil pour la conversion : Chaines / Hexadécimal / Décimal :

    http://easycalculation.com/hex-converter.php

    ---> L'outil qui m'a servit à ouvrir les fichiers plus haut :

    http://mh-nexus.de/en/hxd/


    A+

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Merci bien pour ces nouvelles explications très claires
    Je ne vais cependant pas utiliser la classe binaryreader pour l'instant je souhaite faire sans pour ne pas m'embrouiller,car meme si je pense avoir globalement compris tout ce que tu m'expliques depuis le début de ce poste, je me dis que je me suis surement attaqué a quelques de trop "haut niveau" par rapport à mes connaissances actuelles.

    D'ailleurs
    Est-il nécessaire que je t'explique comment constituer le tableau de bytes ?? nan je pense pas...^^
    Je dirai que si car je ne sais pas comment constituer le tableau pour avoir plusieurs possibilités, j'ai donc faire une chose horrible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                                Dim MP3_1 As Byte() = {255, 251}
                                Dim MP3_2 As Byte() = {255, 250}
                                Dim MP3_3 As Byte() = {73, 68}
     
     If (System.IO.File.ReadAllBytes(tmpFile).Take(2).SequenceEqual(MP3_1) Or System.IO.File.ReadAllBytes(tmpFile).Take(2).SequenceEqual(MP3_2) Or System.IO.File.ReadAllBytes(tmpFile).Take(2).SequenceEqual(MP3_3)) Then
    Merci pour les efforts de patience d'explications dont tu fais preuve

    PS: j'ai effectivement trouvé 73 et 68 pour mes fichiers MP3

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

Discussions similaires

  1. Lire un fichier audio présent dans les ressources
    Par Galdon dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/05/2011, 11h16
  2. Réponses: 3
    Dernier message: 13/11/2008, 10h26
  3. Acceder a un fichier stocker dans les ressources
    Par kacedda dans le forum Visual C++
    Réponses: 4
    Dernier message: 30/07/2007, 12h56
  4. Réponses: 3
    Dernier message: 02/08/2006, 09h21
  5. Réponses: 5
    Dernier message: 16/07/2005, 00h01

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