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

Delphi Discussion :

recuperer la taille d'un fichier.


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut recuperer la taille d'un fichier.
    bonjour, je souhaite recuperer la taille d'un fichier! tous simplement.

    impossible de trouver ca! (aucune source)

    merci d'avance, merci!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Essayes FileSize

    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
    42
    43
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
       f: file of Byte;
       size : Longint;
       S: string;
    begin
       if OpenDialog1.Execute then
       begin
         AssignFile(f, OpenDialog1.FileName);
         Reset(f);
         size := FileSize(f);
         S := ' Taille du fichier ' + Format('%.2f',[(size / 1024)])+ ' ko';
         ShowMessage(s);
         CloseFile(f);
       end;
     end;
     
    end.
    Dans la faq Delphi, il y a aussi des exemples qui font appel à l'api windows.

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    • Il vaut mieux utiliser la solution suivante, surtout si tu veux pouvoir obtenir la taille de gros fichier > 4 Go (Int64) :
    http://delphi.developpez.com/faq/?pa...#taillefichier

    • Je connais une autre méthode sans ouvrir le fichier :
    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
    Function GetFileSizeEx(Const filename: String): Int64;
    Var
      SRec: TSearchrec;
      converter: Packed Record
        Case Boolean Of
          False: (n: int64);
          True: (low, high: DWORD);
      End;
    Begin
      Result := -1;
      If (FindFirst(filename, faAnyfile, SRec) = 0) Then Begin
        converter.Low := SRec.FindData.nFileSizeLow;
        converter.High := SRec.FindData.nFileSizeHigh;
        Result := converter.n;
        FindClose(SRec);
      End;
    End;
    De retour parmis vous après 10 ans!!

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    merci cela marche a merveille!

    c'est parfait. j'envie votre facilité a creer du code propre est efficace comme ca!
    je debute seulement le delphi, mais ca devrais venir

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Une autre solution à base de TSearchRec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      SearchRec: TSearchRec;
    begin
      if OpenDialog1.Execute then
        if FindFirst(OpenDialog1.FileName, faAnyFile, SearchRec) = 0 then
         ShowMessage(FloatToStrF(SearchRec.Size/1048576, ffFixed, 7, 2)+' MB');
      FindClose(SearchRec);
    end;

    N'oublies pas le tag

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Pour info, SearchRec.Size est du type Integer et ne peut donc pas retourner une taille de fichier > à 4Go... La solution est d'utiliser FindData (voir mon post ci-dessus). Les autres solutions sont devenues obsolètes selon moi...
    à+


    Citation Envoyé par Fabrice ROUXEL 1
    N'oublies pas le tag
    De retour parmis vous après 10 ans!!

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 744
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 744
    Points : 15 160
    Points
    15 160
    Par défaut
    Yep !
    type Integer et ne peut donc pas retourner une taille de fichier > à 4Go...
    Nan ! 2,147 et quelques (la limite positive d'un integer, quoi) gig's !

    La preuve, la soluce à FabriceRouxel1 me retourne -1410,57 MB sur un fichier de 2,62 gig's.

    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    -Size est de type integer donc la taille max du fichier doit être < 2GO.

    -Bestiol dans la faq utilise GetFileSize soit un cardinal avec taille max = 4GO

    -La meilleur solution est celle présentée par Sub0 qui propose un Int64 en implementant une "union dans la terminologie du C".

    A ce propos la solution de Sub0 a toute sa place dans la FAQ...

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par Fabrice ROUXEL 1
    A ce propos la solution de Sub0 a toute sa place dans la FAQ...
    Elle y est déjà, mais le code est légèrement différent :

    http://delphi.developpez.com/faq/?pa...#taillefichier

    On peut également utiliser un TFileStream et sa propriété Size, mais cela impose d'ouvrir le fichier...
    De retour parmis vous après 10 ans!!

  11. #11
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Je rejoint Sub0 dans sa réponse ... par contre il y a une petite erreur dans son code. Par précaution I faudra extraire le FindClose(...) du test IF dans le cas où celui ci ne passe pas.

    Cordialement
    Octal
    http://www.pocketmt.com GLCD Font Creator home site.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Si FindFirst ne renvoie pas 0, doit on appeler FindClose?

    Derniere question: le record converter fonctionne t'il sur les systemes little et big endian?

  13. #13
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par Fabrice ROUXEL 1
    Si FindFirst ne renvoie pas 0, doit on appeler FindClose?
    Apparement non. Exemple :
    http://nono40.developpez.com/sources/source0042/

    Et j'ai trouvé ceci aussi : http://pascal.developpez.com/faq/?pa...#FichierExiste
    Certains compilateurs et systèmes d'exploitation attendent l'utilisation de FindClose une fois l'utilisation de FindFirst terminée. C'est notamment le cas sous Windows 9x et suivants. Toutefois, Turbo Pascal ne connaît pas cette procédure, car inutile sous Dos.

    Citation Envoyé par Fabrice ROUXEL 1
    le record converter fonctionne t'il sur les systemes little et big endian?
    Je ne pourrais répondre avec certitude à cette question. Dans tous les cas, je pense qu'il vaut mieux utiliser le code de la Faq avec SHL 32 plutôt que l'enregistrement...
    De retour parmis vous après 10 ans!!

  14. #14
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Autant pour moi. Voilà le code de FindFirst dans l'unité SysUtils

    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
     
    function FindFirst(const Path: string; Attr: Integer;
      var  F: TSearchRec): Integer;
    const
      faSpecial = faHidden or faSysFile or faDirectory;
    {$IFDEF MSWINDOWS}
    begin
      F.ExcludeAttr := not Attr and faSpecial;
      F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
      if F.FindHandle <> INVALID_HANDLE_VALUE then
      begin
        Result := FindMatchingFile(F);
        if Result <> 0 then FindClose(F);
      end else
        Result := GetLastError;
    end;
    (J'ai coupé la partie Linux)
    On y voit clairement que si FindFirst échoue (result<>0) elle apelle elle meme FindClose.
    Donc le code de Sub0 fonctionne parfaitement sans aucun soucis et dans tous les cas.
    http://www.pocketmt.com GLCD Font Creator home site.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Juste une question Octal: Il est open source le code de la VCL?

  16. #16
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Non le code de la VCL n'est pas Open. Il est fourni avec la version professionnelle et entreprise de Delphi, moi je possède la version Pro et au boulot on a la version Entreprise, et c'est l'une des raison pour laquelle j'ai tronqué le code de la routine que j'ai posté.

    Cordialement
    http://www.pocketmt.com GLCD Font Creator home site.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Pour le code sous licence je suis au courant.C'était juste un rappel.

    Borland conseille de suivre le modèle suivant:

    FindFirst searches the directory given by Path for the first entry that
    matches the filename given by Path and the attributes given by Attr. The
    result is returned in the search record given by SearchRec. The return
    value is zero if the function was successful. Otherwise the return value
    is a Windows error code. FindFirst is typically used in conjunction with
    FindNext and FindClose as follows:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Result := FindFirst(Path, Attr, SearchRec);
        while Result = 0 do
        begin
          ProcessSearchRec(SearchRec);
          Result := FindNext(SearchRec);
        end;
        FindClose(SearchRec);
    Ce qui a revient à refermer 2 fois si le 1er result échoue.

Discussions similaires

  1. Recuperer la taille d'un fichier > 4Go avec la STL
    Par falcon74 dans le forum Langage
    Réponses: 13
    Dernier message: 05/10/2009, 12h30
  2. Recuperer la Taille d'un Fichier
    Par med_ellouze dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/08/2007, 12h48
  3. recuperer la taille d'un fichier
    Par opensource dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/06/2007, 16h33
  4. [VB6] [Réseau] Récupérer la taille d'un fichier avec inet
    Par pcpunch dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 20/02/2003, 21h38
  5. [VB6] [Fichier] Récupérer sa taille
    Par SpP dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/09/2002, 19h56

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