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 :

ReadAllbyte d'un fichier


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 69
    Par défaut ReadAllbyte d'un fichier
    Bonjour,

    J'ai developpé une application sur visual en delphi prism et je voudrait la créer sur delphi 2009, cependant j'utilise la fonction readAllByte et je ne trouve pas d'équivalence.
    Voici le code en delphi prism
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fi := new Sytem.IO.FileInfo(file1);
    buffer := new byte[fi.length];
    buffer := system.IO.File.ReadAllBytes(file1);
    Comment je pourais coder cela en delphi?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 114
    Par défaut
    Utilise un TFileStream
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 69
    Par défaut
    Ok c'est ça merci !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fStream := TFileStream.Create(file1, fmOpenRead);    
    fStream.Read(buffer,fStream.Size);
    Le soucis c'est que je souhaiterai envoyer ces données via un composant port COM mais j'ai trouvé que des composants qui n'envoi que des chaines de caractères.
    Comment puis-je envoyer ces données?
    Merci

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 114
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      buffer: AnsiString;
    ...
    fStream := TFileStream.Create(file1, fmOpenRead);
    SetLength(buffer, fStream.Size);   
    fStream.Read(buffer[1],fStream.Size);
    l'utilisation d'une chaine comme buffer, c'est périlleux en Delphi 2009 avec UniCode, normalement la version TComPort 4 pour Delphi 2010 utilise des AnsiString ! ne pas installer une version antérieur !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 69
    Par défaut
    J'ai essayé le bout de code avec le AnsiString mais la variable buffer n'est jamais affecté même aprés la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fStream.Read(buffer[1],fStream.Size);
    ???

  6. #6
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    essaie ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fStream.Read(PChar(buffer)^,fStream.Size);
    Tu peut aussi utiliser TStringStream...

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 114
    Par défaut
    Interressant, j'utilise souvent "ReadBuffer(string[1]..." pour indiquer le début de la chaine, c'est obligatoire avec une chaine longue ou courte ([1]) ou un tableau dynamique ([0]).
    Avec un Tableau Fixe, ce n'est pas utile

    Par prudence PAnsiChar au lieu de PChar, ...

    Faudra qu'un jour que je prenne le temps d'installer Delphi 2010 et etudier ce genre de chose ! Je suis toujours sur la 6 ou la 7

    le TStringStream utilise une UniCodeString ou une AnsiString ?
    Cela ne risque-t-il pas d'influer sur les données ?

    Question con : Stream.Size est supérieur à Zéro ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    j'ai les mêmes craintes que toi je suis toujours D7 D2006 mais la version ne me dérange pas trop ...
    tien je viens juste d'écrire la version unicode de Fileexists
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function Fileexists(const FileName: Widestring): boolean;
    var
      Handle: THandle;
      FindData: TWin32FindDataW;
    begin
      Result :=false;
      Handle := Windows.FindFirstFileW(PWideChar(FileName), FindData);
      if (Handle <> DWORD(-1)) then
      begin
        Windows.FindClose(Handle);
        Result:=(FindData.dwFileAttributes and 16 )=0;
      end;
    end;
    Il peut aussi utiliser TWideStrings disponible depuis D2006 ...
    Par prudence PAnsiChar au lieu de PChar, ...
    pas de souci même avec Pointer(Buffer)^
    Question con : Stream.Size est supérieur à Zéro ?
    Pas de problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function GetFileContenent(const Filename :string):AnsiString;
    begin
       with TFilestream.Create(Filename,fmopenread)do
       try
          SetLength(Result,Size);
          Read(Pointer(Result)^,Size);
       finally
         Free;
       end;
    end;
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     S:=GetFileContenent('c:\R.txt');

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 69
    Par défaut
    Le fichier que je doit envoyer n'est pas en faite un fichier txt mais un fichier wav, c'est pour cela cela que je souhaite avoir des bytes et un composant qui transfere ces données en tant que bytes.
    C'est aussi pour cela peut être que la variable buffer n'est jamais affecté avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fStream.Read(PChar(buffer)^,fStream.Size);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fStream.Read(buffer[1],fStream.Size);

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 114
    Par défaut
    Tu as des caractères #0, en fait elle doit être affectée mais il est incapable de l'afficher !

    parcours la chaine avec une boucle, et tu verras ce qu'elle contient !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 69
    Par défaut
    Idem avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fStream.Read(PChar(buffer)^,fStream.Size);
    for i:=0 to fStream.Size - 1 do
          ShowMessage(buffer[i]);
    ???

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 114
    Par défaut
    une chaine cela se parcours de 1 à length, déjà faudrait apprendre les bases de manipulation des chaines !

    Est-ce que Size est bien supérieur à Zéro ?

    Ensuite, si je dis qu'il n'est pas capable d'afficher, l'utilisation du ShowMessage est contraire à ce que je disais !

    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
     
    S := '';
    K := 0;
    for i:= 1 to Length(Buffer) do
    begin
      S := S + IntToStr(Ord(Buffer[I])) + ' ';
      if I mod 15 = 0 then
      begin
        Memo1.Lines.Add(S);
        S := '';
      end;
    end;
     
    if S > '' then
      Memo1.Lines.Add(S);
    On pourrait aussi utiliser BinToHex !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 69
    Par défaut
    Daccrord, il ya bien des valeurs dans la variable mais lorsque j'envoi sur le port:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComPort1.WriteStr(buffer);
    comment être sur qu'il envoi les données ou les #0?

  14. #14
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 114
    Par défaut
    la méthode WriteStr renvoie un Integer, c'est normalement la longueur de la chaine, étudie le code de TComPort, selon les options, le comportement est différent !

    Rien n'empêche de mettre un autre TComPort et avec OnRxChar de débugguer ton 1er TComPort
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  2. Réponses: 5
    Dernier message: 20/08/2002, 18h01
  3. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31
  4. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 09h45

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