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 :

Lecture de fichier


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Lecture de fichier
    Bonjour à tous

    J'utilise une routine pépère de lecture

    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
    function lisfichier(var donnees:string;const Nomfichier:string):boolean;
    var fs:tfilestream;
        f:tsearchrec;
        erreur,taille:integer;
    begin
        result:=false;
        donnees:='';
        if not fileexists(Nomfichier) then begin
            exit;
    //        showmessage(Fichier+' introuvable');
    //        beep;
        end;
        erreur:=findfirst(nomfichier,faanyfile,f);
        taille:=f.Size;
        SysUtils.findclose(f);
     
        if erreur>0 then exit;
        if taille=0 then begin result:=true;exit;end;
     
    //lecture
        try
            fs:=tfilestream.create(Nomfichier,fmOpenRead );
        except
    //        communique('Litfichier: Impossible de lire le fichier '+fichier);
            try
                freeandnil(fs);//ce free déclenche occasionnellement une erreur vriament étrange.
            except
            end;
            exit;
        end;
        setlength(donnees,taille);
        fs.read(PChar(donnees)^,taille);
    //        fs.Destroy;
        freeandnil(fs);
        result:=true;
    end;
    Mais quand je compare avec 7zip, ça me semble très lent...

    Auriez-vous une routine qui arrache?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 736
    Points : 25 645
    Points
    25 645
    Par défaut
    En fait, tu fais plein de truc en double tfilestream va aussi faire le FileExists, une exception sera renvoyé si tu ne peux pas l'instancier, la classe d'excep
    ption EFileStreamError par exemple

    FindFirst, pas plus utile puisque que tfilestream contient une propriété Size, FindFirst lance une recherche, ce n'est pas si léger que cela

    Enfin, tu charges tout le fichier en mémoire, imaginons, ton PC à 1Go donc 600Mo déjà occupé, tu ouvres un fichier de 500Mo, tu auras du mal à atteindre le 1Go de RAM en réalité que Windows commence à faire du SWAP donc ton fichier chargé en mémoire se retrouve finalement écrit sur disque !

    Ce code sous D7 est valable, attention sur D2009 et XE, mauvaise surprises, tu va lire un buffer brut vers une chaine UnicodeString, le nombre d'octet ne correspond a au nombre de Char (en général, c'est 2 octet par char en UTF16, ça monte à 4 pour les langues que l'on utilise pas souvent en france où l'on a fréquemment que le BMP )

    Citation Envoyé par sgmsg Voir le message
    ce free déclenche occasionnellement une erreur vriament étrange.
    Non c'est tout à fait normal !
    Si une exception se produit durant le TFileStream.Create alors fs n'est jamais affecté, la valeur fs est aléatoire, parfois c'est zéro donc le Free ne provoque pas d'erreur et d'autres fois cela contient une valeur non zéro considéré comme un pointeur, cela tente de libérer un objet qui n'existe pas !

    Voici un code bien suffisant, si l'on reste dans l'état d'une lecture brute de décoffrage

    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
    function lisfichier(var donnees:AnsiString; const Nomfichier: TFileName):boolean;
    begin    
      try
         with TFileStream.Create(Nomfichier, fmOpenRead) do
         try       
           Result := true;
           SetLength(donnees, Size);
           if Size > 0 then 
             Read(PAnsiChar(donnees)^, Size); 
         finally
           Free();
         end;
      except
        on E: Exception do 
        begin
          // communique('Litfichier: Impossible de lire le fichier (erreur : '+E.Message+') : '+fichier);
          Result := false;
        end;
      end;   
    end;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Merci
    Ta routine arrache!!!

    Merci

    C'est comme trois fois plus vite.

    Mon vieux PC va être soulagé

    Je comprend bien ton explication sur le fs parfois zéro parfois pas. Mais j'aurais jamais compris cela tout seul.

    Merci encore !!!

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 20h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 12h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 12h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 21h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 10h43

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