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

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

    Informations forums :
    Inscription : mars 2003
    Messages : 81
    Points : 43
    Points
    43
    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 chevronné
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 181
    Points : 2 220
    Points
    2 220
    Billets dans le blog
    6
    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
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 81
    Points : 43
    Points
    43
    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 éclairé
    Avatar de Cirec
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 379
    Points : 880
    Points
    880
    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
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 81
    Points : 43
    Points
    43
    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 chevronné
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 181
    Points : 2 220
    Points
    2 220
    Billets dans le blog
    6
    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 éclairé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    juillet 2011
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : juillet 2011
    Messages : 279
    Points : 730
    Points
    730
    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, 15h20
  2. Réponses: 4
    Dernier message: 26/05/2015, 10h10
  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, 14h34
  4. Réponses: 0
    Dernier message: 16/01/2009, 16h15
  5. Comment lire un fichier image
    Par Charlemagne dans le forum DirectX
    Réponses: 9
    Dernier message: 12/03/2004, 01h22

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