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

Langage Delphi Discussion :

Comment lire un fichier .INF pour le récupérer dans un TMEMO de Delphi 7 ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut Comment lire un fichier .INF pour le récupérer dans un TMEMO de Delphi 7 ?
    Bonjour,
    J'ai écrit jadis un programme en Delphi 7 pour rechercher une information dans des fichiers de types texte (.PAS .BAT.TXT ...).
    Je voudrais l'utiliser pour faire la même chose avec des fichiers .INF issus des .CAB des drivers d'imprimantes de Windows 10.
    Malheureusement ces fichiers ont deux particularités :
    - les premiers octets ont des valeurs particulières (voir le .jpg), j'ai rien trouvé sur la signification de ces octets, et TMemo n’affiche que 2 caractères.
    - chaque caractère est sur 2 octets, le deuxième a la valeur 00 je suppose de l'Unicode (pas supporté par Delphi 7)
    Remarques :
    Lecture de ces .Inf : Notepad et Wordpad arrive correctement, JvMemo met un blanc après chaque caractère.
    Pourquoi lire des inf explication dans :
    https://www.developpez.net/forums/d2...windows-10-a/#
    Question :
    Avant d'injecter le fichier INF dans un TMemo peut-on par TStream ou autre composant neutraliser les octets parasites et si oui comment ?
    D'avance merci.
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Ton ficher 'inf' est un Unicode. Donc en D7 tu peux (entre autres) lire dans un TMemoryStream à partir du 3ème octet en prenant un octet sur deux et le mettre dans un string ;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut Suite
    ---------------------
    Bonjour,
    Grand merci cela fonctionne parfaitement.
    Voici mon essai :
    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
     
    // **************************************************
    procedure TForm1.Button1Click(Sender: TObject);
      VAR
        P : Integer;
        Flux :TMEMORYSTREAM;
        Longueur : Longint;
        Buffer : Byte;
        Travail : Boolean;
        Info : String;
      BEGIN
        TRY
        Memo1.Clear;
        Flux:=TMEMORYSTREAM.CREATE;	// Créer un flux en mémoire
        Flux.LoadFromFile(Edit1.Text);
        Flux.SEEK(4,0);	// Origine : 0 début, 1 position courant
        Longueur:=Flux.Size;
        Travail:=True;
        P:=4;
        Info:='';
        While Travail Do
          Begin
            Flux.READ(Buffer,1);// Récupérer un octet
            Info:=Info+CHR(Buffer);
            // Déplacer de 1 le pointeur pour sauter le "0"
            Flux.SEEK(1,1);
            P:=P+2;
            If P>longueur Then Travail:=False;
          end;
        Memo1.Lines.Add(Info);
          FINALLY
            Flux.Free; // Détruire l'objet
          END
      end;
    // **************************************************
    Il est certainement possible de faire plus simple ou plus "académique".

  4. #4
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,

    une autre méthode:
    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
    procedure TForm4.Button2Click(Sender: TObject);
    var
      s: array of WideChar;
      P: PWideChar;
    begin
      with TMemoryStream.Create do
      try
        LoadFromFile('usb.inf');
        SetLength(S, Size);
        P := @S[0];
        ReadBuffer(P^, size);
        Memo1.Text := P;
      finally
        Free;
      end;
    end;
    Cordialement,

    @+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut Suite
    Bonjour,
    Merci, votre solution est bien plus professionnelle.
    Question complémentaire :
    Je suppose qu’il doit encore exister des fichiers INF non « Unicode ». Pour faire la différence peut-on tester les 2 premiers octets ? Si oui sur quelle valeur ?
    D’avance merci.

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par dennler Voir le message
    Bonjour,
    Merci, votre solution est bien plus professionnelle.
    Question complémentaire :
    Je suppose qu’il doit encore exister des fichiers INF non « Unicode ». Pour faire la différence peut-on tester les 2 premiers octets ? Si oui sur quelle valeur ?
    D’avance merci.
    Sur les deux premiers octets FF et FE

  7. #7
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 432
    Points : 1 128
    Points
    1 128
    Par défaut
    Bonjour

    Citation Envoyé par ALWEBER Voir le message
    Sur les deux premiers octets FF et FE
    Il s'agit du BOM (byte order mark) il peut valoir FFFE en UTF16 LE (souvent depuis Windows) ou FEFF en UTF16 BE https://en.wikipedia.org/wiki/Byte_order_mark

    NB Il y en a d'autres mais peu utilisés même celui destiné à UTF8 (EFBBBF traduction directe en UTF8 des BOM UTF16) n'est quasiment jamais positionné.

    Cordialement

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 19/08/2015, 14h20
  2. Réponses: 4
    Dernier message: 26/05/2015, 09h10
  3. Comment lire un fichier XML et l'écrire dans une variable XML en C#
    Par Bonne Année dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 21/01/2009, 13h34
  4. Réponses: 0
    Dernier message: 16/01/2009, 15h15
  5. Comment lire un fichier image
    Par Charlemagne dans le forum DirectX
    Réponses: 9
    Dernier message: 12/03/2004, 00h22

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